Enrichment x stress MA

Supplementary Material

Setting-up

Loading packages

# devtools::install_github('Mikata-Project/ggthemr', force = TRUE)

pacman::p_load(tidyverse, here, metafor, clubSandwich, orchaRd, MuMIn, patchwork,
    GoodmanKruskal, networkD3, ggplot2, visdat, ggalluvial, ggthemr, cowplot, grDevices,
    png, grid, gridGraphics, pander, formatR)
# needed for model selection using MuMIn within metafor
eval(metafor:::.MuMIn)

Loading data and functions

This loads the unprocessed datafile and custom functions including

  • calculating ‘focal’ and ‘pair-wise’ effect sizes and variance
  • calculating SMD
  • creating VCV of variance
dat <- read_csv(here("Data", "Data_raw.csv"))
# Load custom function to extract data
source(here("R/Functions.R"))

Data organisation

  • removing study (Wang et al_2020) with negative values as lnRR cannot be calculated with negative values
  • rounding down sample sizes that are reported as decimals due to averaging n across treatments
  • getting effect sizes from function
  • ‘flipping’ effect sizes so that all effect sizes are higher values = individuals do better in cognitive assays
  • assigning human readable terms, and creating VCV of variance
# removing study with negative values as these are unable to be used for lnRR
dat <- droplevels(dat[!dat$First_author == 'Wang',])

#rounding down sample sizes
dat$CC_n <- floor(dat$CC_n)
dat$EC_n <- floor(dat$EC_n)
dat$CS_n <- floor(dat$CS_n)
dat$ES_n <- floor(dat$CS_n)

# 'Focal' effect_size 
effect_size <- with(dat, mapply(effect_set, 
                      CC_n ,
                      CC_mean, 
                      CC_SD,
                      EC_n, 
                      EC_mean, 
                      EC_SD,
                      CS_n, 
                      CS_mean, 
                      CS_SD,
                      ES_n, 
                      ES_mean, 
                      ES_SD,
                      percent = Response_percent,
                      SIMPLIFY = FALSE))
effect_size <- map_dfr(effect_size, I)

# 'Pairwise' effect size
 effect_size2 <- with(dat, mapply(effect_set2, 
                      CC_n ,
                      CC_mean, 
                      CC_SD,
                      EC_n, 
                      EC_mean, 
                      EC_SD,
                      CS_n, 
                      CS_mean, 
                      CS_SD,
                      ES_n, 
                      ES_mean, 
                      ES_SD,
                      percent = Response_percent,
                      SIMPLIFY = FALSE))
effect_size2 <- map_dfr(effect_size2, I)

full_info <- which(complete.cases(effect_size) == TRUE)

# adding effect sizes as column
dat <- bind_cols(dat, effect_size, effect_size2)
dat <- dat[full_info, ]

#Flipping 'lower is better' to 'higher is better' effect sizes
#flipping lnRR for values where higher = worse
dat$lnRR_Ea <- ifelse(dat$Response_direction == 2, dat$lnRR_E*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_E))
# currently NAswhich causes error
dat$lnRR_Sa  <- ifelse(dat$Response_direction == 2, dat$lnRR_S*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_S)) # currently NAswhich causes error
dat$lnRR_ESa <-  ifelse(dat$Response_direction == 2, dat$lnRR_ES*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_ES)) # currently NAswhich causes error
#flipping 'pure effect sizes'
dat$lnRR_E2a <- ifelse(dat$Response_direction == 2, dat$lnRR_E2*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_E2)) # currently NAswhich causes error
dat$lnRR_S2a  <- ifelse(dat$Response_direction == 2, dat$lnRR_S2*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_S2)) # currently NAswhich causes error
dat$lnRR_ES2a <-  ifelse(dat$Response_direction == 2, dat$lnRR_ES2*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_ES2)) # currently NAswhich causes error
dat$lnRR_E3a <-  ifelse(dat$Response_direction == 2, dat$lnRR_E3*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_E3)) # currently NAswhich causes error
dat$lnRR_S3a <-  ifelse(dat$Response_direction == 2, dat$lnRR_S3*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_S3)) # currently NAswhich causes error

#flipping SMD
dat$SMD_Ea <- ifelse(dat$Response_direction == 2, dat$SMD_E*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$SMD_E)) # currently NAswhich causes error
dat$SMD_Sa  <- ifelse(dat$Response_direction == 2, dat$SMD_S*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$SMD_S)) # currently NAswhich causes error
dat$SMD_ESa <-  ifelse(dat$Response_direction == 2, dat$SMD_ES*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$SMD_ES))

# assigning human readable terms
dat <- dat %>% mutate(Type_assay = case_when(Type_assay == 1 ~ "Habituation",
                                                Type_assay == 2 ~ "Conditioning",
                                                Type_assay == 3 ~ "Recognition", 
                                                Type_assay == 4 ~ "Unclear"),
                      Learning_vs_memory = case_when(Learning_vs_memory == 1 ~ "Learning",
                                                     Learning_vs_memory == 2 ~ "Memory", 
                                                     Learning_vs_memory == 3 ~ "Habituation"),
                      Type_reinforcement = case_when(Type_reinforcement== 1 ~"Appetitive",
                                                         Type_reinforcement== 2 ~ "Aversive",
                                                         Type_reinforcement== 3 ~ "Not applicable",
                                                         Type_reinforcement== 4 ~ "Unclear"),
                      Type_stress_exposure = case_when(Type_stress_exposure == 1 ~ "Density",
                                                       Type_stress_exposure == 2 ~ "Scent",
                                                       Type_stress_exposure == 3 ~ "Shock",
                                                       Type_stress_exposure == 4 ~ "Exertion",
                                                       Type_stress_exposure == 5 ~ "Restraint",
                                                       Type_stress_exposure == 6 ~ "MS",
                                                       Type_stress_exposure == 7 ~ "Circadian rhythm",
                                                       Type_stress_exposure == 8 ~ "Noise",
                                                       Type_stress_exposure == 9 ~ "Other",
                                                       Type_stress_exposure == 10 ~ "Combination",
                                                       Type_stress_exposure == 11 ~ "unclear"), 
                      Age_stress_exposure = case_when(Age_stress_exposure == 1 ~ "Prenatal",
                                                      Age_stress_exposure == 2 ~ "Early postnatal",
                                                      Age_stress_exposure == 3 ~ "Adolescent",
                                                      Age_stress_exposure == 4 ~ "Adult",
                                                      Age_stress_exposure == 5 ~ "Unclear"),
                      Stress_duration = case_when(Stress_duration == 1 ~ "Acute",
                                                  Stress_duration == 2 ~ "Chronic",
                                                  Stress_duration == 3 ~ "Intermittent",
                                                  Stress_duration == 4 ~ "Unclear"),
                      EE_social = case_when(EE_social == 1 ~ "Social",
                                            EE_social== 2 ~ "Non-social", 
                                            EE_social == 3 ~ "Unclear"), 
                      EE_exercise = case_when(EE_exercise == 1 ~ "Exercise", 
                                              EE_exercise == 2 ~ "No exercise"),
                      Age_EE_exposure = case_when(Age_EE_exposure == 1 ~ "Prenatal", 
                                                  Age_EE_exposure == 2 ~ "Early postnatal",
                                                  Age_EE_exposure == 3 ~ "Adolescent", 
                                                  Age_EE_exposure == 4 ~ "Adult",
                                                  Age_EE_exposure == 5 ~ "Unclear"),
                      Exposure_order = case_when(Exposure_order == 1 ~ "Stress first",
                                                      Exposure_order == 2 ~ "Enrichment first",
                                                      Exposure_order == 3 ~ "Concurrently", 
                                                      Exposure_order == 4 ~ "Unclear"),
                      Age_assay = case_when(Age_assay == 1 ~ "Early postnatal",
                                            Age_assay == 2 ~ "Adolescent",
                                            Age_assay == 3 ~ "Adult", 
                                            Age_assay == 4 ~ "Unclear"),
                      Sex = case_when(Sex == 1 ~ "Female", 
                                      Sex == 2 ~ "Male", 
                                      Sex == 3 ~ "Mixed", 
                                      Sex == 4 ~ "Unclear"),
                      Type_EE_exposure = case_when(Type_EE_exposure == 1 ~ "Nesting material",
                                                      Type_EE_exposure == 2 ~ "Objects",
                                                      Type_EE_exposure == 3 ~ "Cage complexity", 
                                                      Type_EE_exposure == 4 ~ "Wheel/trademill",
                                                      Type_EE_exposure == 5 ~ "Combination",
                                                      Type_EE_exposure == 6 ~ "Other", 
                                                      Type_EE_exposure == 7 ~ "Unclear"),
                      ROB_blinding = case_when(ROB_blinding == 1 ~ "Yes",
                                               ROB_blinding == 2 ~ "No",
                                               ROB_blinding == 3 ~ "Unclear"),
                      ROB_randomisation = case_when(ROB_randomisation == 1 ~ "Yes",
                                                    ROB_randomisation == 2 ~ "No",
                                                    ROB_randomisation == 3 ~ "Unclear"))

#making variance VCVs
VCV_E <- impute_covariance_matrix(vi = dat$lnRRV_E, cluster = dat$Study_ID, r = 0.5)
VCV_S <- impute_covariance_matrix(vi = dat$lnRRV_S, cluster = dat$Study_ID, r = 0.5)
VCV_ES <- impute_covariance_matrix(vi = dat$lnRRV_ES, cluster = dat$Study_ID, r = 0.5)

VCV_Ea <- impute_covariance_matrix(vi = dat$SMDV_E, cluster = dat$Study_ID, r = 0.5)
VCV_Sa <- impute_covariance_matrix(vi = dat$SMDV_S, cluster = dat$Study_ID, r = 0.5)
VCV_ESa <- impute_covariance_matrix(vi = dat$SMDV_ES, cluster = dat$Study_ID, r = 0.5)

#write.csv(dat, file = here("Data", 'Data_processed.csv'), row.names = TRUE)

Data exploration

General

Number of effect sizes

# Number of effect sizes
length(unique(dat$ES_ID))
## [1] 92

Number of studies

length(unique(dat$Study_ID))
## [1] 30

Publication year range

min(dat$Year_published)
## [1] 2006
max(dat$Year_published)
## [1] 2021

Visual of missing data

plot_missing <- vis_miss(dat) + theme(plot.title = element_text(hjust = 0.5, vjust = 3),
    plot.margin = margin(t = 0.5, r = 3, b = 1, l = 1, unit = "cm")) + ggtitle("Missing data in the selected predictors")  #no missing values

plot_missing

# useGoodman and Kruskal’s τ measure of association between categorical
# predictor variables (function from package GoodmanKruskal:
# https://cran.r-project.org/web/packages/GoodmanKruskal/vignettes/GoodmanKruskal.html)
# GKmatrix <- GKtauDataframe(subset(dat, select = c('Sex', 'Type_assay',
# 'Learning_vs_memory', #'Type_reinforcement', 'Type_stress_exposure',
# 'Age_stress_exposure', 'Stress_duration', #'EE_social_HR', 'EE_exercise',
# 'Age_EE_exposure', 'Exposure_order', 'Age_assay'))) plot(GKmatrix)

# simple pairwise contingency tables table(dat$Type_assay,
# dat$Type_reinforcement) table(dat$Age_stress_exposure, dat$Age_EE_exposure)
# table(dat$Type_stress_exposure, dat$Age_stress_exposure)
# table(dat$Type_stress_exposure, dat$Age_assay)
# table(dat$Type_stress_exposure, dat$Stress_duration)

Visual of missing data for each column. Note that most missing data are for different descriptive statistics as papers are often report results using different types of descriptive statistics (i.e., SD, SE, mean, median etc). Cannot reduce text size in this figure

Alluvial diagrams

Shows the relationship/nestedness of different data elements (used to produce Fig. 2)

Subjects info: species-strain-sex

freq_A <- as.data.frame(table(dat$Sex, dat$Common_species, dat$Strain)) %>%
    rename(Sex = Var1, Species = Var2, Strain = Var3)  #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_A), axes = 1:3, silent = TRUE)

p1 <- ggplot(data = freq_A, aes(axis1 = Sex, axis2 = Species, axis3 = Strain, y = Freq)) +
    geom_alluvium(aes(fill = Sex)) + geom_flow() + geom_stratum(aes(fill = Sex)) +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + geom_text(stat
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + "stratum",
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + aes(label
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + after_stat(stratum)))
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + #theme_minimal()
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
theme_void() + theme(legend.position = "none", plot.title = element_text(hjust = 0,
    vjust = 3), axis.title.x = element_text(), axis.text.x = element_text(face = "bold"),
    plot.margin = unit(c(1, 1, 0, 1), "cm")) + scale_x_discrete(limits = c("Sex",
    "Species", "Strain"), expand = c(0.15, 0.05), position = "top") + ggtitle("A  study subjects")

p1

Fig. 2a Relationship/nestedness between study species, strain of rodent, and sex

Environmental enrichment info: age-exercise-social EE

freq_B <- as.data.frame(table(dat$Age_EE_exposure, dat$EE_exercise, dat$EE_social)) %>%
    rename(Age_EE_exposure = Var1, EE_exercise = Var2, EE_social = Var3)  #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_B), axes = 1:3, silent = TRUE)

p2 <- ggplot(data = freq_B, aes(axis1 = Age_EE_exposure, axis2 = EE_exercise, axis3 = EE_social,
    y = Freq)) + geom_alluvium(aes(fill = Age_EE_exposure)) + geom_flow() + geom_stratum(aes(fill = Age_EE_exposure)) +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + geom_text(stat
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + "stratum",
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + aes(label
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + after_stat(stratum)))
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + #theme_minimal()
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
theme_void() + theme(legend.position = "none", plot.title = element_text(hjust = 0,
    vjust = 3), axis.title.x = element_text(), axis.text.x = element_text(face = "bold"),
    plot.margin = unit(c(1, 1, 0, 1), "cm")) + scale_x_discrete(limits = c("Age",
    "Exercise", "Social"), expand = c(0.1, 0.1), position = "top") + ggtitle("B  environmental enrichment")

p2

Fig. 2b Relationship/nestedness between the age of enrichment exposure, if enrichment involved a manipulation of exercise and social environment

Stress info: age-duration-type stress

freq_C <- as.data.frame(table(dat$Age_stress_exposure, dat$Stress_duration, dat$Type_stress_exposure)) %>%
    rename(Age_stress = Var1, Duration_stress = Var2, Type_stress = Var3)  #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_C), axes = 1:3, silent = TRUE)

p3 <- ggplot(data = freq_C, aes(axis1 = Age_stress, axis2 = Duration_stress, axis3 = Type_stress,
    y = Freq)) + geom_alluvium(aes(fill = Age_stress)) + geom_flow() + geom_stratum(aes(fill = Age_stress)) +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + geom_text(stat
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + "stratum",
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + aes(label
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + after_stat(stratum)))
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + #theme_minimal()
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
theme_void() + theme(legend.position = "none", plot.title = element_text(hjust = 0,
    vjust = 3), axis.title.x = element_text(), axis.text.x = element_text(face = "bold"),
    plot.margin = unit(c(1, 1, 0, 1), "cm")) + scale_x_discrete(limits = c("Age",
    "Duration", "Type"), expand = c(0.1, 0.1), position = "top") + ggtitle("C  stress exposure")

p3

Fig. 2c Relationship/nestedess between the age of stress exposure, the duration of the stres, and the type of stress

Assay info: LvsM-type-reinforcement

freq_D <- as.data.frame(table(dat$Learning_vs_memory, dat$Type_assay, dat$Type_reinforcement)) %>%
    rename(Learning_Memory = Var1, Type = Var2, Reinforcement = Var3)  #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_D), axes = 1:3, silent = TRUE)

p4 <- ggplot(data = freq_D, aes(axis1 = Learning_Memory, axis2 = Type, axis3 = Reinforcement,
    y = Freq)) + geom_alluvium(aes(fill = Learning_Memory)) + geom_flow() + geom_stratum(aes(fill = Learning_Memory)) +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + geom_text(stat
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + "stratum",
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + aes(label
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + after_stat(stratum)))
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + #theme_minimal()
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
theme_void() + theme(legend.position = "none", plot.title = element_text(hjust = 0,
    vjust = 3), axis.title.x = element_text(), axis.text.x = element_text(face = "bold"),
    plot.margin = unit(c(1, 1, 0, 1), "cm")) + scale_x_discrete(limits = c("Learning_Memory",
    "Type", "Reinforcement"), expand = c(0.1, 0.1), position = "top") + ggtitle("D  cognitive assay")

p4

Fig. 2d Relationship/nestedness between if the assay measured a learning or memory trait, the type of assay used, and the type of reinforcement used

Combined plot

# p1 + scale_fill_brewer(palette = 'Set3') #Pastel1

(p1 + scale_fill_brewer(palette = "Set3"))/(p2 + scale_fill_brewer(palette = "Set3"))/(p3 +
    scale_fill_brewer(palette = "Set3"))/(p4 + scale_fill_brewer(palette = "Set3")) +
    plot_layout(ncol = 1, heights = c(1, 1, 1, 1, 1))

# ggsave(file = './figs/Alluvial_diagrams_v2.pdf', width = 10, height = 12,
# units = 'cm', dpi = 300, scale = 2) #, device = cairo_pdf)

Fig. 2 The combined plot of all alluvial diagrams used to make Fig. 2 in the main text

Risk of Bias

Percent of studies that used randomisation

dat %>%
    group_by(ROB_randomisation) %>%
    summarise(n = n_distinct(Study_ID))
## # A tibble: 2 x 2
##   ROB_randomisation     n
##   <chr>             <int>
## 1 Unclear              15
## 2 Yes                  15
15/30
## [1] 0.5

Percent of studies that used blinding

# blinding
dat %>%
    group_by(ROB_blinding) %>%
    summarise(n = n_distinct(Study_ID))
## # A tibble: 2 x 2
##   ROB_blinding     n
##   <chr>        <int>
## 1 Unclear         24
## 2 Yes              6
6/30
## [1] 0.2

Modelling with lnRR

Main effect: environmental enrichment

Meta-analysis

#dat <- read_csv(here("Data","Data_processed.csv"))

mod_E0 <- rma.mv(yi = lnRR_Ea, V = VCV_E, random = list(~1|Study_ID,
                                                          ~1|ES_ID,
                                                          ~1|Strain),
                 test = "t",
                 data = dat)
summary(mod_E0) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.7836   19.5672   27.5672   37.6106   28.0323   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0082  0.0905     30     no  Study_ID 
## sigma^2.2  0.0345  0.1858     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 809.2712, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.1860  0.0320  5.8116  91  <.0001  0.1224  0.2496  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E0) 
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 9.310673e-01 1.786605e-01 7.524068e-01 6.097041e-10
orchard_plot(mod_E0, mod = "Int", xlab = "lnRR", alpha=0.4) +  # Orchard plot 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5)+ # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2)+ # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_colour_manual(values = "darkorange")+ # change colours
  scale_fill_manual(values="darkorange")+ 
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 24), # change font sizes
        legend.title = element_text(size = 15),
        legend.text = element_text(size = 13)) 

Fig. 3 Orchard plot showing meta-analytic mean and 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Meta-regression: uni-moderator

Learning vs Memory

Was the response learning or memory?

mod_E1 <-  rma.mv(yi = lnRR_Ea, V = VCV_E, mod = ~Learning_vs_memory-1, random = list(~1|Study_ID,
                                                                                        ~1|ES_ID,
                                                                                        ~1|Strain),
                  test = "t",
                  data = dat)

summary(mod_E1) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.3793   18.7586   28.7586   41.2577   29.4729   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0076  0.0873     30     no  Study_ID 
## sigma^2.2  0.0340  0.1843     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 802.5794, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 18.2861, p-val < .0001
## 
## Model Results:
## 
##                             estimate      se    tval  df    pval   ci.lb 
## Learning_vs_memoryLearning    0.2303  0.0450  5.1227  90  <.0001  0.1410 
## Learning_vs_memoryMemory      0.1624  0.0355  4.5713  90  <.0001  0.0919 
##                              ci.ub 
## Learning_vs_memoryLearning  0.3197  *** 
## Learning_vs_memoryMemory    0.2330  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E1) 
##   R2_marginal R2_coditional 
##    0.02572583    1.00000000
LvsM_E<- orchard_plot(mod_E1, mod = "Learning_vs_memory", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21) + # mean estimate
  scale_size_continuous(range = c(1, 7)) + # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

LvsM_E

Fig. 4a Orchard plot showing the group-wise means of the categorical variable ‘Learning_vs_memory’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Pairwise comparison
contra_mod_E1 <- contrast_fun(data = dat, response = lnRR_Ea, moderator = Learning_vs_memory,
    VCV = VCV_E)
res_table_mod_E1 <- get_estimate(model = mod_E1, contra = contra_mod_E1, moderator = Type_assay)

res_table_mod_E1
## # A tibble: 3 x 7
##   Levels                   Estimate Lower_CI Upper_CI  P_value Lower_PI Upper_PI
##   <chr>                       <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1 Learning_vs_memoryLearn…   0.230    0.141    0.320   1.70e-6   -0.185    0.645
## 2 Learning_vs_memoryMemory   0.162    0.0919   0.233   1.54e-5   -0.249    0.574
## 3 Learning_vs_memoryLearn…  -0.0679  -0.164    0.0284  1.65e-1   -0.484    0.349

Type of assay

The broad category of the type of assay used to measure learning or memory

dat1 <- filter(dat, Type_assay %in% c("Recognition", "Habituation", "Conditioning"))
VCV_E1 <- impute_covariance_matrix(vi = dat1$lnRRV_E, cluster = dat$Study_ID, r = 0.5)

mod_E2 <- rma.mv(yi = lnRR_Ea, V = VCV_E1, mod = ~Type_assay-1, random = list(~1|Study_ID,
                                                                                  ~1|ES_ID,
                                                                                  ~1|Strain),
                 test = "t",
                 data = dat1)

summary(mod_E2)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -7.8496   15.6993   27.6993   42.6311   28.7237   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0099  0.0995     30     no  Study_ID 
## sigma^2.2  0.0321  0.1792     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 661.8903, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 12.7993, p-val < .0001
## 
## Model Results:
## 
##                         estimate      se    tval  df    pval    ci.lb   ci.ub 
## Type_assayConditioning    0.2167  0.0351  6.1650  89  <.0001   0.1468  0.2865 
## Type_assayHabituation     0.1821  0.1147  1.5886  89  0.1157  -0.0457  0.4100 
## Type_assayRecognition     0.0554  0.0640  0.8659  89  0.3889  -0.0717  0.1826 
##  
## Type_assayConditioning  *** 
## Type_assayHabituation 
## Type_assayRecognition 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E2) 
##   R2_marginal R2_coditional 
##    0.07376134    1.00000000
Learning_E <- orchard_plot(mod_E2, mod = "Type_assay", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  scale_colour_manual(values = c("grey34","grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34", "grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Learning_E

Fig. 4b Orchard plot showing the group-wise means of the categorical variable ‘Type_assay’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Pairwise comparisons
contra_mod_E2 <- contrast_fun(data = dat1, response = lnRR_Ea, moderator = Type_assay,
    VCV = VCV_E1)
res_table_mod_E2 <- get_estimate(model = mod_E2, contra = contra_mod_E2, moderator = Type_assay)

res_table_mod_E2
## # A tibble: 6 x 7
##   Levels                Estimate Lower_CI Upper_CI     P_value Lower_PI Upper_PI
##   <chr>                    <dbl>    <dbl>    <dbl>       <dbl>    <dbl>    <dbl>
## 1 Conditioning            0.217    0.147    0.287      2.02e-8   -0.197    0.630
## 2 Habituation             0.182   -0.0457   0.410      1.16e-1   -0.285    0.649
## 3 Recognition             0.0554  -0.0717   0.183      3.89e-1   -0.371    0.482
## 4 Conditioning-Habitua…  -0.0345  -0.262    0.193      7.63e-1   -0.501    0.432
## 5 Conditioning-Recogni…  -0.161   -0.296   -0.0265     1.96e-2   -0.590    0.268
## 6 Habituation-Recognit…  -0.127   -0.381    0.127      3.24e-1   -0.607    0.353

Type of reinforcement

If conditioning was used, was aversive or appetitive reinforcement used?

dat2 <- filter(dat, Type_reinforcement %in% c("Appetitive", "Aversive", "Not applicable"))
VCV_E2 <- impute_covariance_matrix(vi = dat2$lnRRV_E, cluster = dat2$Study_ID, r = 0.5)
mod_E3 <- rma.mv(yi = lnRR_Ea, V = VCV_E2, mod = ~ Type_reinforcement-1, random = list(~1|Study_ID,
                                                                                            ~1|ES_ID,
                                                                                            ~1|Strain),
                 test = "t",
                 data = dat2)

summary(mod_E3)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -7.8702   15.7405   27.7405   42.6723   28.7649   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0109  0.1046     30     no  Study_ID 
## sigma^2.2  0.0319  0.1787     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 764.5984, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 12.4138, p-val < .0001
## 
## Model Results:
## 
##                                   estimate      se    tval  df    pval    ci.lb 
## Type_reinforcementAppetitive        0.2175  0.0726  2.9942  89  0.0036   0.0732 
## Type_reinforcementAversive          0.2191  0.0410  5.3456  89  <.0001   0.1377 
## Type_reinforcementNot applicable    0.0812  0.0560  1.4504  89  0.1505  -0.0300 
##                                    ci.ub 
## Type_reinforcementAppetitive      0.3618   ** 
## Type_reinforcementAversive        0.3006  *** 
## Type_reinforcementNot applicable  0.1924      
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E3) 
##   R2_marginal R2_coditional 
##    0.07720103    1.00000000
Reinforcement_E <-orchard_plot(mod_E3, mod = "Type_reinforcement", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  scale_colour_manual(values = c("grey34","grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34", "grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Reinforcement_E

Fig. 4c Orchard plot showing the group-wise means of the categorical variable ‘Type_reinforcement’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Pairwise comparisons
contra_mod_E3 <- contrast_fun(data = dat2, response = lnRR_Ea, moderator = Type_reinforcement,
    VCV = VCV_E2)
res_table_mod_E3 <- get_estimate(model = mod_E3, contra = contra_mod_E3, moderator = Type_reinforcement)

res_table_mod_E3
## # A tibble: 6 x 7
##   Levels                 Estimate Lower_CI Upper_CI    P_value Lower_PI Upper_PI
##   <chr>                     <dbl>    <dbl>    <dbl>      <dbl>    <dbl>    <dbl>
## 1 Appetitive              0.217     0.0732   0.362     3.56e-3   -0.218    0.653
## 2 Aversive                0.219     0.138    0.301     6.89e-7   -0.200    0.638
## 3 Not applicable          0.0812   -0.0300   0.192     1.50e-1   -0.345    0.507
## 4 Appetitive-Aversive     0.00164  -0.163    0.167     9.84e-1   -0.442    0.445
## 5 Appetitive-Not applic… -0.136    -0.315    0.0425    1.33e-1   -0.585    0.312
## 6 Aversive-Not applicab… -0.138    -0.259   -0.0172    2.56e-2   -0.567    0.291

Age of enrichment

The age when individuals were exposed to environmental enrichment

dat3 <- filter(dat, Age_EE_exposure %in% c("Adult", "Adolescent"))
VCV_E3 <- impute_covariance_matrix(vi = dat3$lnRRV_E, cluster = dat3$Study_ID, r = 0.5)


mod_E4 <- rma.mv(yi = lnRR_Ea, V = VCV_E3, mod = ~Age_EE_exposure-1, random = list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                 test = "t",
                 data = dat3)

summary(mod_E4) 
## 
## Multivariate Meta-Analysis Model (k = 88; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -6.9490   13.8980   23.8980   36.1698   24.6480   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0078  0.0885     29     no  Study_ID 
## sigma^2.2  0.0327  0.1808     88     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 86) = 782.6092, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 86) = 18.9060, p-val < .0001
## 
## Model Results:
## 
##                            estimate      se    tval  df    pval   ci.lb   ci.ub 
## Age_EE_exposureAdolescent    0.1799  0.0370  4.8553  86  <.0001  0.1062  0.2535 
## Age_EE_exposureAdult         0.2340  0.0620  3.7734  86  0.0003  0.1107  0.3573 
##  
## Age_EE_exposureAdolescent  *** 
## Age_EE_exposureAdult       *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E4) 
##   R2_marginal R2_coditional 
##    0.01127347    1.00000000
Age_E<- orchard_plot(mod_E4, mod = "Age_EE_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10))  

Age_E

Fig. 4d Orchard plot showing the group-wise means of the categorical variable ‘Age_EE_exposure’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Pairwise comparisons
contra_mod_E4 <- contrast_fun(data = dat3, response = lnRR_Ea, moderator = Age_EE_exposure,
    VCV = VCV_E3)
res_table_mod_E4 <- get_estimate(model = mod_E4, contra = contra_mod_E4, moderator = Age_EE_exposure)

res_table_mod_E4
## # A tibble: 3 x 7
##   Levels           Estimate Lower_CI Upper_CI    P_value Lower_PI Upper_PI
##   <chr>               <dbl>    <dbl>    <dbl>      <dbl>    <dbl>    <dbl>
## 1 Adolescent         0.180    0.106     0.254 0.00000533   -0.227    0.587
## 2 Adult              0.234    0.111     0.357 0.000295     -0.185    0.653
## 3 Adolescent-Adult   0.0541  -0.0895    0.198 0.456        -0.371    0.479

Exercise enrichment

Did enrichment involve the addition of apparatus for voluntary exercise (e.g., a wheel or treadmill)?

mod_E5<- rma.mv(yi = lnRR_Ea, V = VCV_E, mod = ~EE_exercise-1, random = list(~1|Study_ID,
                                                                               ~1|ES_ID,
                                                                               ~1|Strain),
                test = "t",
                data = dat)

summary(mod_E5)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -10.0303   20.0606   30.0606   42.5597   30.7749   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0096  0.0980     30     no  Study_ID 
## sigma^2.2  0.0345  0.1857     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 807.7169, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 16.1666, p-val < .0001
## 
## Model Results:
## 
##                         estimate      se    tval  df    pval   ci.lb   ci.ub 
## EE_exerciseExercise       0.1849  0.0407  4.5464  90  <.0001  0.1041  0.2657 
## EE_exerciseNo exercise    0.1900  0.0556  3.4151  90  0.0010  0.0795  0.3005 
##  
## EE_exerciseExercise     *** 
## EE_exerciseNo exercise  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E5) 
##   R2_marginal R2_coditional 
##  0.0001360993  0.9999999987
Exercise_E <-orchard_plot(mod_E5, mod = "EE_exercise", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Exercise_E

Fig. 4d Orchard plot showing the group-wise means of the categorical variable ‘EE_exercise’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Pairwise comparisons
contra_mod_E5 <- contrast_fun(data = dat, response = lnRR_Ea, moderator = EE_exercise,
    VCV = VCV_E)
res_table_mod_E5 <- get_estimate(model = mod_E5, contra = contra_mod_E5, moderator = EE_exercise)

res_table_mod_E5
## # A tibble: 3 x 7
##   Levels               Estimate Lower_CI Upper_CI   P_value Lower_PI Upper_PI
##   <chr>                   <dbl>    <dbl>    <dbl>     <dbl>    <dbl>    <dbl>
## 1 Exercise              0.185     0.104     0.266 0.0000169   -0.240    0.610
## 2 No exercise           0.190     0.0795    0.301 0.000958    -0.241    0.621
## 3 Exercise-No exercise  0.00511  -0.132     0.142 0.941       -0.434    0.444

Social enrichment

Did enrichment involve more conspecifics (note that we did not include studies that only provided social enrichment but no other form of abiotic enrichment)?

dat4 <- filter(dat, EE_social %in% c("Social", "Non-social"))
VCV_E4 <- impute_covariance_matrix(vi = dat4$lnRRV_E, cluster = dat4$Study_ID, r = 0.5)
  
mod_E6<- rma.mv(yi = lnRR_Ea, V = VCV_E4, mod = ~EE_social-1, random = list(~1|Study_ID, 
                                                                             ~1|ES_ID,
                                                                             ~1|Strain),
                test = "t",data = dat4)

summary(mod_E6)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.3254   18.6507   28.6507   41.1498   29.3650   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0095  0.0974     30     no  Study_ID 
## sigma^2.2  0.0340  0.1844     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 801.5313, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 17.0110, p-val < .0001
## 
## Model Results:
## 
##                      estimate      se    tval  df    pval   ci.lb   ci.ub 
## EE_socialNon-social    0.1413  0.0498  2.8349  90  0.0057  0.0423  0.2403   ** 
## EE_socialSocial        0.2204  0.0432  5.0976  90  <.0001  0.1345  0.3063  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E6) 
##   R2_marginal R2_coditional 
##    0.03377455    1.00000000
Social_E <-orchard_plot(mod_E6, mod = "EE_social", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Social_E 

Fig. 4e Orchard plot showing the group-wise means of the categorical variable ‘EE_social’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Pairwise comparisons
contra_mod_E6 <- contrast_fun(data = dat4, response = lnRR_Ea, moderator = EE_social,
    VCV = VCV_E4)
res_table_mod_E6 <- get_estimate(model = mod_E5, contra = contra_mod_E6, moderator = EE_social)

res_table_mod_E6
## # A tibble: 3 x 7
##   Levels                   Estimate Lower_CI Upper_CI  P_value Lower_PI Upper_PI
##   <chr>                       <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1 EE_exerciseExercise        0.185    0.104     0.266  1.69e-5   -0.240    0.610
## 2 EE_exerciseNo exercise     0.190    0.0795    0.301  9.58e-4   -0.241    0.621
## 3 EE_exerciseExercise-EE_…   0.0791  -0.0520    0.210  2.34e-1   -0.355    0.514

Publication bias & sensitivity analysis

Multi-moderator model

# filter data so that all K < 5 are removed
dat_Efm <- dat %>%
    filter(Type_assay %in% c("Recognition", "Habituation", "Conditioning"), Type_reinforcement %in%
        c("Appetitive", "Aversive", "Not applicable"), EE_social %in% c("Social",
        "Non-social"), Age_EE_exposure %in% c("Adult", "Adolescent"))

VCV_Efm <- impute_covariance_matrix(vi = dat_Efm$lnRRV_E, cluster = dat_Efm$Study_ID,
    r = 0.5)

mod_Efm <- rma.mv(yi = lnRR_Sa, V = VCV_Efm, mod = ~Type_assay - 1 + Learning_vs_memory +
    Type_reinforcement + EE_social + EE_exercise + Age_EE_exposure, random = list(~1 |
    Study_ID, ~1 | ES_ID, ~1 | Strain), test = "t", data = dat_Efm)
# summary(mod_Efm) r2_ml(mod_Efm)

res_Efm <- dredge(mod_Efm, trace = 2)
saveRDS(res_Efm, file = here("Rdata", "res_Efm.rds"))
# also saving the full model and data
saveRDS(mod_Efm, file = here("Rdata", "mod_Efm.rds"))
saveRDS(dat_Efm, file = here("Rdata", "dat_Efm.rds"))

The akaike weights for the top set of models with AIC < 6

dat_Efm <- readRDS(file = here("Rdata", "dat_Efm.rds"))
mod_Efm <- readRDS(file = here("Rdata", "mod_Efm.rds"))
res_Efm <- readRDS(file = here("Rdata", "res_Efm.rds"))
res_Efm2 <- subset(res_Efm, delta <= 6, recalc.weights = FALSE)
importance(res_Efm2)
##                      Age_EE_exposure Type_assay EE_exercise EE_social
## Sum of weights:      0.63            0.36       0.16        0.14     
## N containing models:   11              10          5           5     
##                      Learning_vs_memory Type_reinforcement
## Sum of weights:      0.10               0.07              
## N containing models:    4                  4

Funnel plot

Used to produce Fig. 7a

# funnel plot
Funnel_E <- funnel(mod_Efm, xlab = "lnRR", ylab = "Standard Error")

# Funnel_E

Fig.7a Funnel plot showing the standard error and residuals (lnRR) from the full model.

# year published was scaled previously under stress PB
dat_Efm$sqrt_inv_e_n <- with(dat_Efm, sqrt(1/CC_n + 1/EC_n + 1/ES_n + 1/CS_n))

PB_MR_E <- rma.mv(lnRR_Sa, lnRRV_S, mods = ~1 + sqrt_inv_e_n + Learning_vs_memory +
    Year_published + Type_assay + Type_reinforcement + EE_social + EE_exercise +
    Age_stress_exposure, random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML",
    test = "t", data = dat_Efm)

# PB_MR_E

estimates_PB_MR_E <- estimates.CI(PB_MR_E)
# estimates_PB_MR_E

Leave-one-out analysis

Individually removing studies to distinguish that no singular study is having a disproportionate effect

dat$Study_ID <- as.factor(dat$Study_ID)

LeaveOneOut_effectsize <- list()
for (i in 1:length(levels(dat$Study_ID))) {

    d <- dat %>%
        filter(Study_ID != levels(dat$Study_ID)[i])

    VCV_Eb <- impute_covariance_matrix(vi = d$lnRRV_E, cluster = d$Study_ID, r = 0.5)

    LeaveOneOut_effectsize[[i]] <- rma.mv(yi = lnRR_Ea, V = VCV_Eb, random = list(~1 |
        Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", data = dat[dat$Study_ID !=
        levels(dat$Study_ID)[i], ])
}

# TODO Shinichi to check

# writing function for extracting est, ci.lb, and ci.ub from all models
est.func <- function(mod_E0) {
    df <- data.frame(est = mod_E0$b, lower = mod_E0$ci.lb, upper = mod_E0$ci.ub)
    return(df)
}



# using dplyr to form data frame
MA_CVR_E <- lapply(LeaveOneOut_effectsize, function(x) est.func(x)) %>%
    bind_rows %>%
    mutate(left_out = levels(dat$Study_ID))


saveRDS(MA_CVR_E, file = here("Rdata", "MA_CVR_E.rds"))

Used to produce Fig. S3

# telling ggplot to stop reordering factors
MA_CVR_E <- readRDS(file = here("Rdata", "MA_CVR_E.rds"))

MA_CVR_E$left_out <- as.factor(MA_CVR_E$left_out)
MA_CVR_E$left_out <- factor(MA_CVR_E$left_out, levels = MA_CVR_E$left_out)


# plotting
leaveoneout_E <- ggplot(MA_CVR_E) + geom_hline(yintercept = 0, lty = 2, lwd = 1) +
    geom_hline(yintercept = mod_E0$ci.lb, lty = 3, lwd = 0.75, colour = "black") +
    geom_hline(yintercept = mod_E0$b, lty = 1, lwd = 0.75, colour = "black") + geom_hline(yintercept = mod_E0$ci.ub,
    lty = 3, lwd = 0.75, colour = "black") + geom_pointrange(aes(x = left_out, y = est,
    ymin = lower, ymax = upper)) + xlab("Study left out") + ylab("lnRR, 95% CI") +
    coord_flip() + theme(panel.grid.minor = element_blank()) + theme_bw() + theme(panel.grid.major = element_blank()) +
    theme(panel.grid.minor.x = element_blank()) + theme(axis.text.y = element_text(size = 6))

leaveoneout_E

dat$Study_ID <- as.integer(dat$Study_ID)

Fig. S3 Leave-one-group-out analysis showing meta-analytic mean and 95% CI when each individual study is removed from the data set.

Using SMD

Re-rerunning meta-analytic model using standardised mean difference (SMD) instead of lnRR

mod_E0a <- rma.mv(yi = SMD_Ea, V = VCV_Ea, random = list(~1 | Study_ID, ~1 | ES_ID,
    ~1 | Strain), test = "t", data = dat)
summary(mod_E0a)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##    logLik   Deviance        AIC        BIC       AICc 
## -111.6284   223.2568   231.2568   241.3003   231.7220   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.2512  0.5012     30     no  Study_ID 
## sigma^2.2  0.4247  0.6517     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 673.4722, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.7241  0.1295  5.5895  91  <.0001  0.4668  0.9814  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E0a)
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 8.673320e-01 3.223202e-01 5.450118e-01 1.749563e-09

Main effect: stress

Meta-analysis

mod_S0 <- rma.mv(yi = lnRR_Sa, V = VCV_S, random = list(~1|Study_ID,
                                                          ~1|ES_ID,
                                                          ~1|Strain),
                 test = "t", 
                 data = dat)

summary(mod_S0) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -14.1156   28.2312   36.2312   46.2747   36.6964   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0099  0.0993     30     no  Study_ID 
## sigma^2.2  0.0377  0.1941     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 946.9234, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb    ci.ub 
##  -0.1052  0.0337  -3.1217  91  0.0024  -0.1721  -0.0383  ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S0) 
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 9.376124e-01 1.946168e-01 7.429955e-01 1.975455e-10
orchard_plot(mod_S0, mod = "Int", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 24), # change font sizes
        legend.title = element_text(size = 15),
        legend.text = element_text(size = 13)) 

Fig. 3 Orchard plot showing meta-analytic mean and 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Meta-regression: uni-moderator

Learning vs Memory

Was the response learning or memory?

mod_S1 <-  rma.mv(yi = lnRR_Sa, V = VCV_S, mod = ~Learning_vs_memory-1, random = list(~1|Study_ID,
                                                                                        ~1|ES_ID,
                                                                                        ~1|Strain),
                  test = "t",
                  data = dat)

summary(mod_S1) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -14.5281   29.0562   39.0562   51.5553   39.7705   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0094  0.0970     30     no  Study_ID 
## sigma^2.2  0.0388  0.1969     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 946.3930, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 5.0145, p-val = 0.0086
## 
## Model Results:
## 
##                             estimate      se     tval  df    pval    ci.lb 
## Learning_vs_memoryLearning   -0.1211  0.0476  -2.5423  90  0.0127  -0.2157 
## Learning_vs_memoryMemory     -0.0974  0.0380  -2.5648  90  0.0120  -0.1728 
##                               ci.ub 
## Learning_vs_memoryLearning  -0.0265  * 
## Learning_vs_memoryMemory    -0.0219  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S1) 
##   R2_marginal R2_coditional 
##   0.002776034   1.000000000
LvsM_S <- orchard_plot(mod_S1, mod = "Learning_vs_memory", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

LvsM_S 

Fig. 5a Orchard plot showing the group-wise means of the categorical variable ‘Learning_vs_memory’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Type of assay

The broad category of the type of assay used to measure learning or memory

dat$Type_assay<-as.factor(dat$Type_assay)

VCV_S1 <- impute_covariance_matrix(vi = dat1$lnRRV_S, cluster = dat$Study_ID, r = 0.5)


mod_S2 <- rma.mv(yi = lnRR_Sa, V = VCV_S1, mod = ~Type_assay-1, random =   list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                 test = "t",
                 data = dat1)

summary(mod_S2)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.8028   19.6055   31.6055   46.5374   32.6299   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0161  0.1271     30     no  Study_ID 
## sigma^2.2  0.0279  0.1671     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 723.4973, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 6.7053, p-val = 0.0004
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb    ci.ub 
## Type_assayConditioning   -0.0981  0.0375  -2.6192  89  0.0104  -0.1725  -0.0237 
## Type_assayHabituation    -0.4615  0.1126  -4.0969  89  <.0001  -0.6853  -0.2377 
## Type_assayRecognition    -0.0534  0.0645  -0.8287  89  0.4095  -0.1816   0.0747 
##  
## Type_assayConditioning    * 
## Type_assayHabituation   *** 
## Type_assayRecognition 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S2) 
##   R2_marginal R2_coditional 
##     0.1853359     1.0000000
Learning_S <-orchard_plot(mod_S2, mod = "Type_assay", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Learning_S

Fig. 5b Orchard plot showing the group-wise means of the categorical variable ‘Type_assay’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Type of reinforcement

If conditioning was used, was aversive or appetitive reinforcement used?

VCV_S2 <- impute_covariance_matrix(vi = dat2$lnRRV_S, cluster = dat$Study_ID, r = 0.5)

mod_S3 <- rma.mv(yi = lnRR_Sa, V = VCV_S2, mod = ~ Type_reinforcement-1, random = list(~1|Study_ID,
                                                                                            ~1|ES_ID,
                                                                                            ~1|Strain),
                 test = "t",
                 data = dat2)

summary(mod_S3)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -13.8810   27.7621   39.7621   54.6939   40.7864   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0103  0.1016     30     no  Study_ID 
## sigma^2.2  0.0387  0.1966     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 920.8439, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.7942, p-val = 0.0130
## 
## Model Results:
## 
##                                   estimate      se     tval  df    pval 
## Type_reinforcementAppetitive       -0.1846  0.0749  -2.4649  89  0.0156 
## Type_reinforcementAversive         -0.0730  0.0427  -1.7081  89  0.0911 
## Type_reinforcementNot applicable   -0.1172  0.0590  -1.9851  89  0.0502 
##                                     ci.lb    ci.ub 
## Type_reinforcementAppetitive      -0.3334  -0.0358  * 
## Type_reinforcementAversive        -0.1579   0.0119  . 
## Type_reinforcementNot applicable  -0.2345   0.0001  . 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S3) 
##   R2_marginal R2_coditional 
##     0.0366428     1.0000000
Reinforcement_S <-orchard_plot(mod_S3, mod = "Type_reinforcement", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Reinforcement_S

Fig. 5c Orchard plot showing the group-wise means of the categorical variable ‘Type_reinforcement’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Age of stress

The age when individuals were exposed to stress

mod_S4 <-rma.mv(yi = lnRR_Sa, V = VCV_S, mod = ~Age_stress_exposure-1, random = list(~1|Study_ID,
                                                                                       ~1|ES_ID,
                                                                                       ~1|Strain),
                test = "t",
                data = dat)
summary(mod_S4) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -12.4083   24.8166   38.8166   56.1579   40.2166   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0048  0.0694     30     no  Study_ID 
## sigma^2.2  0.0392  0.1979     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 88) = 881.1229, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 88) = 4.3703, p-val = 0.0029
## 
## Model Results:
## 
##                                     estimate      se     tval  df    pval 
## Age_stress_exposureAdolescent         0.0074  0.1159   0.0641  88  0.9490 
## Age_stress_exposureAdult             -0.2279  0.0622  -3.6664  88  0.0004 
## Age_stress_exposureEarly postnatal   -0.0561  0.0435  -1.2891  88  0.2007 
## Age_stress_exposurePrenatal          -0.1145  0.0743  -1.5404  88  0.1271 
##                                       ci.lb    ci.ub 
## Age_stress_exposureAdolescent       -0.2228   0.2377      
## Age_stress_exposureAdult            -0.3514  -0.1044  *** 
## Age_stress_exposureEarly postnatal  -0.1425   0.0304      
## Age_stress_exposurePrenatal         -0.2621   0.0332      
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S4) 
##   R2_marginal R2_coditional 
##    0.09987307    1.00000000
Age_S <- orchard_plot(mod_S4, mod = "Age_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34", "grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Age_S 

Fig. 5d Orchard plot showing the group-wise means of the categorical variable ‘Age_stress_exposure’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Type of stress

The type of stressor used

dat5 <- filter(dat, Type_stress_exposure %in% c("Restraint", "Noise", "MS", "Combination"))
VCV_S3 <- impute_covariance_matrix(vi = dat5$lnRRV_S, cluster = dat5$Study_ID, r = 0.5)

mod_S4 <- rma.mv(yi = lnRR_Sa, V = VCV_S3, mod = ~Type_stress_exposure-1, random = list(~1|Study_ID,
                                                                                         ~1|ES_ID,
                                                                                         ~1|Strain),
                 test = "t",
                 data = dat5)
summary(mod_S4) 
## 
## Multivariate Meta-Analysis Model (k = 85; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -11.4138   22.8276   36.8276   53.5887   38.3618   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0115  0.1071     25     no  Study_ID 
## sigma^2.2  0.0401  0.2002     85     no     ES_ID 
## sigma^2.3  0.0000  0.0000      4     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 81) = 897.4553, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 81) = 2.8767, p-val = 0.0278
## 
## Model Results:
## 
##                                  estimate      se     tval  df    pval    ci.lb 
## Type_stress_exposureCombination   -0.0500  0.0892  -0.5605  81  0.5767  -0.2274 
## Type_stress_exposureMS            -0.0539  0.0560  -0.9630  81  0.3384  -0.1653 
## Type_stress_exposureNoise         -0.1203  0.1036  -1.1608  81  0.2491  -0.3265 
## Type_stress_exposureRestraint     -0.2101  0.0704  -2.9863  81  0.0037  -0.3501 
##                                    ci.ub 
## Type_stress_exposureCombination   0.1274     
## Type_stress_exposureMS            0.0575     
## Type_stress_exposureNoise         0.0859     
## Type_stress_exposureRestraint    -0.0701  ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S4)
##   R2_marginal R2_coditional 
##    0.07029554    1.00000000
Stressor<- orchard_plot(mod_S4, mod = "Type_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34", "grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Stressor

Fig. 5e Orchard plot showing the group-wise means of the categorical variable ‘Type_stress_exposure’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Stess duration

Was the stress acute or chronic?

dat6 <- filter(dat, Stress_duration %in% c("Chronic", "Acute"))
VCV_S4 <- impute_covariance_matrix(vi = dat6$lnRRV_S, cluster = dat6$Study_ID, r = 0.5)

mod_S5 <-rma.mv(yi = lnRR_Sa, V = VCV_S4, mod = ~Stress_duration-1, random = list(~1|Study_ID,
                                                                                   ~1|ES_ID,
                                                                                   ~1|Strain),
                test = "t",
                data = dat6)
summary(mod_S5) 
## 
## Multivariate Meta-Analysis Model (k = 89; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -13.7898   27.5796   37.5796   49.9092   38.3204   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0062  0.0786     29     no  Study_ID 
## sigma^2.2  0.0391  0.1978     89     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 87) = 915.9393, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 87) = 6.6661, p-val = 0.0020
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb    ci.ub 
## Stress_durationAcute      0.0135  0.0659   0.2045  87  0.8384  -0.1176   0.1445 
## Stress_durationChronic   -0.1360  0.0373  -3.6456  87  0.0005  -0.2101  -0.0618 
##  
## Stress_durationAcute 
## Stress_durationChronic  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S5) 
##   R2_marginal R2_coditional 
##    0.08245896    1.00000000
Duration_S <- orchard_plot(mod_S5, mod = "Stress_duration", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Duration_S 

Fig. 5f Orchard plot showing the group-wise means of the categorical variable ‘Stress_duration’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Publication bias & sensitivity analysis

Multi-moderator model

# selecting moderator levels with k >=5
dat_Sfm <- dat %>%
    filter(Type_assay %in% c("Recognition", "Habituation", "Conditioning"), Type_reinforcement %in%
        c("Appetitive", "Aversive", "Not applicable"), Type_stress_exposure %in%
        c("Restraint", "Noise", "MS", "Combination"), Stress_duration %in% c("Chronic",
        "Acute"))

VCV_Sfm <- impute_covariance_matrix(vi = dat_Sfm$lnRRV_E, cluster = dat_Sfm$Study_ID,
    r = 0.5)

mod_Sfm <- rma.mv(yi = lnRR_Sa, V = VCV_Sfm, mod = ~Type_assay - 1 + Learning_vs_memory +
    Type_reinforcement + Type_stress_exposure + Age_stress_exposure + Stress_duration,
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), test = "t", data = dat_Sfm)
# summary(mod_Sfm) r2_ml(mod_Sfm)

res_Sfm <- dredge(mod_Sfm, trace = 2)
saveRDS(res_Sfm, file = here("Rdata", "res_Sfm.rds"))
# also saving the full model and data
saveRDS(mod_Sfm, file = here("Rdata", "mod_Sfm.rds"))
saveRDS(dat_Sfm, file = here("Rdata", "dat_Sfm.rds"))

The akaike weights for the top set of models with AIC < 6

dat_Sfm <- readRDS(file = here("Rdata", "dat_Sfm.rds"))
mod_Sfm <- readRDS(file = here("Rdata", "mod_Sfm.rds"))
res_Sfm <- readRDS(file = here("Rdata", "res_Sfm.rds"))
res_Sfm2 <- subset(res_Sfm, delta <= 6, recalc.weights = FALSE)
importance(res_Sfm2)
##                      Type_assay Stress_duration Type_stress_exposure
## Sum of weights:      0.91       0.88            0.22                
## N containing models:    7          6               2                
##                      Learning_vs_memory Age_stress_exposure Type_reinforcement
## Sum of weights:      0.16               0.04                0.04              
## N containing models:    2                  1                   1

Funnel plot

Used to produce Fig. 7b

# funnel plot
Funnel_S <- funnel(mod_Sfm, xlab = "lnRR", ylab = "Standard Error")

Funnel_S
##               x          y slab
## 1  -0.113053232 0.36468860    1
## 2  -0.015439898 0.20610340    2
## 3  -0.248010857 0.31117978    3
## 4  -0.232933972 0.39558646    4
## 5  -0.042387513 0.28415283    5
## 6  -0.371377055 0.24616892    6
## 7  -0.299243891 0.33372726    7
## 8   0.044834345 0.28792375    8
## 9   0.126615612 0.17056933    9
## 10 -0.177388895 0.16829598   10
## 11 -0.247450735 0.25159343   11
## 12  0.460979011 0.26162092   12
## 13 -0.554560458 0.33539070   13
## 14  0.680693862 0.30867691   14
## 15 -0.471382295 0.25172620   15
## 16 -0.394493983 0.23638600   16
## 17 -0.650018042 0.27849269   17
## 18 -0.300841465 0.25362984   18
## 19  0.027931562 0.19059106   19
## 20  0.080720040 0.19033477   20
## 21  0.041790076 0.24429542   21
## 22  0.203537585 0.10208024   22
## 23  0.124260874 0.14463442   23
## 24  0.116691372 0.14706024   24
## 25 -0.121449889 0.14833999   25
## 26 -0.001971635 0.19205933   26
## 27 -0.003907599 0.20022315   27
## 28  0.120523677 0.21113795   28
## 29  0.404659861 0.21388659   29
## 30 -0.109516461 0.22302661   30
## 31 -0.001061616 0.19288079   31
## 32 -0.004468007 0.19262936   32
## 33  0.043909789 0.18566567   33
## 34  0.115869661 0.18965184   34
## 35 -0.011278194 0.09467548   35
## 36  0.175061863 0.18048966   36
## 37 -0.122130273 0.22610402   37
## 38  0.002684314 0.17636045   38
## 39  0.035121843 0.18537686   39
## 40 -0.156416652 0.15860530   40
## 41 -0.138825592 0.15899389   41
## 42  0.053065175 0.17943678   42
## 43  0.138424978 0.18297543   43
## 44  0.102483572 0.18367269   44
## 45  0.170732200 0.19143563   45
## 46  0.139838423 0.18382247   46
## 47  0.128377093 0.17993531   47
## 48  0.221166287 0.18370137   48
## 49  0.044994292 0.18507026   49
## 50 -0.255771493 0.15305831   50
## 51  0.040084756 0.13800224   51
## 52  0.117345431 0.17133452   52
## 53  0.225493174 0.17017071   53
## 54 -0.041531740 0.18021370   54
## 55  0.380896989 0.79456429   55
## 56  0.014647194 0.18626025   56
## 57 -0.239220751 0.20755664   57
## 58  0.200890800 0.26208602   58
## 59  0.478075273 0.39791794   59
## 60 -0.693031272 0.44427913   60
## 61 -0.446007512 0.22443320   61
## 62 -0.385573815 0.31627073   62
## 63  0.187438535 0.29281093   63
## 64 -0.357529861 0.30767463   64
## 65 -0.206432699 0.18443973   65
## 66 -0.072514197 0.18259794   66
## 67 -0.058864366 0.39854817   67
## 68  0.552319003 0.28778615   68
## 69  0.499178177 0.26916891   69
## 70  0.527506647 0.32337519   70
## 71 -0.162795600 0.23927168   71
## 72 -0.032389680 0.19746325   72
## 73  0.107665252 0.24604039   73
## 74  0.209204201 0.16352434   74
## 75 -0.174302918 0.19626869   75
## 76 -0.021661369 0.19202699   76
## 77 -0.024341578 0.23180570   77
## 78  0.052275983 0.18465565   78
## 79  0.331124135 0.46142545   79
## 80 -0.102398694 0.20899450   80
## 81  0.349947062 0.56232826   81
## 82  0.203444436 0.16285272   82

Fig.7b Funnel plot showing the standard error and residuals (lnRR) from the full model.

# calculating inv effective sample size for use in full meta-regression
dat_Sfm$sqrt_inv_e_n <- with(dat_Sfm, sqrt(1/CC_n + 1/EC_n + 1/ES_n + 1/CS_n))

# time lag bias and eggers regression
dat_Sfm$c_Year_published <- as.vector(scale(dat_Sfm$Year_published, scale = F))

PB_MR_S <- rma.mv(lnRR_Sa, lnRRV_S, mods = ~1 + sqrt_inv_e_n + c_Year_published +
    Type_assay + Learning_vs_memory + Type_reinforcement + Type_stress_exposure +
    Age_stress_exposure, random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML",
    test = "t", data = dat_Sfm, control = list(optimizer = "optim", optmethod = "Nelder-Mead"))

# PB_MR_S

estimates_PB_MR_S <- estimates.CI(PB_MR_S)
# estimates_PB_MR_S

Leave-one-out sensitivity analysis

dat$Study_ID <- as.factor(dat$Study_ID)

LeaveOneOut_effectsize <- list()
for (i in 1:length(levels(dat$Study_ID))) {
    d <- dat %>%
        filter(Study_ID != levels(dat$Study_ID)[i])

    VCV_Sb <- impute_covariance_matrix(vi = d$lnRRV_E, cluster = d$Study_ID, r = 0.5)

    LeaveOneOut_effectsize[[i]] <- rma.mv(yi = lnRR_Sa, V = VCV_Sb, random = list(~1 |
        Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", data = dat[dat$Study_ID !=
        levels(dat$Study_ID)[i], ])
}


# writing function for extracting est, ci.lb, and ci.ub from all models
est.func <- function(mod_S0) {
    df <- data.frame(est = mod_S0$b, lower = mod_S0$ci.lb, upper = mod_S0$ci.ub)
    return(df)
}


# using dplyr to form data frame
MA_CVR_S <- lapply(LeaveOneOut_effectsize, function(x) est.func(x)) %>%
    bind_rows %>%
    mutate(left_out = levels(dat$Study_ID))

saveRDS(MA_CVR_S, file = here("Rdata", "MA_CVR_S.rds"))

Used to produce Fig. S4

MA_CVR_S <- readRDS(file = here("Rdata", "MA_CVR_S.rds"))

# telling ggplot to stop reordering factors
MA_CVR_S$left_out <- as.factor(MA_CVR_S$left_out)
MA_CVR_S$left_out <- factor(MA_CVR_S$left_out, levels = MA_CVR_S$left_out)

# plotting
leaveoneout_S <- ggplot(MA_CVR_S) + geom_hline(yintercept = 0, lty = 2, lwd = 1) +
    geom_hline(yintercept = mod_S0$ci.lb, lty = 3, lwd = 0.75, colour = "black") +
    geom_hline(yintercept = mod_S0$b, lty = 1, lwd = 0.75, colour = "black") + geom_hline(yintercept = mod_S0$ci.ub,
    lty = 3, lwd = 0.75, colour = "black") + geom_pointrange(aes(x = left_out, y = est,
    ymin = lower, ymax = upper)) + xlab("Study left out") + ylab("lnRR, 95% CI") +
    coord_flip() + theme(panel.grid.minor = element_blank()) + theme_bw() + theme(panel.grid.major = element_blank()) +
    theme(panel.grid.minor.x = element_blank()) + theme(axis.text.y = element_text(size = 6))

leaveoneout_S

dat$Study_ID <- as.integer(dat$Study_ID)

Fig. S4 Leave-one-group-out analysis showing meta-analytic mean and 95% CI when each individual study is removed from the data set.

Using SMD

Re-rerunning meta-analytic model using standardised mean difference (SMD) instead of lnRR

mod_S0a <- rma.mv(yi = SMD_Sa, V = VCV_Sa, random = list(~1 | Study_ID, ~1 | ES_ID,
    ~1 | Strain), test = "t", data = dat)
summary(mod_S0a)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##    logLik   Deviance        AIC        BIC       AICc 
## -120.2817   240.5634   248.5634   258.6068   249.0285   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.3874  0.6224     30     no  Study_ID 
## sigma^2.2  0.4969  0.7049     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 818.5592, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb    ci.ub 
##  -0.4256  0.1498  -2.8403  91  0.0056  -0.7232  -0.1279  ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S0a)
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 8.959540e-01 3.924790e-01 5.034750e-01 1.438454e-09

Interaction: enrichment x stress

Meta-analysis

mod_ES0 <- rma.mv(yi = lnRR_ESa, V = VCV_ES, random = list(~1|Study_ID,
                                                             ~1|ES_ID,
                                                             ~1|Strain),
                  test = "t", 
                  data = dat)

summary(mod_ES0) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.8178   81.6355   89.6355   99.6790   90.1006   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0316  0.1777     30     no  Study_ID 
## sigma^2.2  0.0229  0.1513     92     no     ES_ID 
## sigma^2.3  0.0030  0.0544      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 303.2179, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.1229  0.0596  2.0605  91  0.0422  0.0044  0.2414  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_ES0) 
##    I2_total I2_Study_ID    I2_ES_ID   I2_Strain 
##  0.81703063  0.44913873  0.32576306  0.04212884
orchard_plot(mod_ES0, mod = "Int", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 24), # change font sizes
        legend.title = element_text(size = 15),
        legend.text = element_text(size = 13)) 

Fig. 3 Orchard plot showing meta-analytic mean and 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Meta-regression: uni-moderator

Learning vs Memory

Was the response learning or memory?

mod_ES1 <-  rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~Learning_vs_memory-1, random = list(~1|Study_ID, 
                                                                                           ~1|ES_ID,
                                                                                           ~1|Strain),
                   test = "t",
                   data = dat)

summary(mod_ES1) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.4769   80.9539   90.9539  103.4529   91.6682   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0292  0.1708     30     no  Study_ID 
## sigma^2.2  0.0232  0.1524     92     no     ES_ID 
## sigma^2.3  0.0034  0.0582      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 299.1854, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 2.9219, p-val = 0.0590
## 
## Model Results:
## 
##                             estimate      se    tval  df    pval    ci.lb 
## Learning_vs_memoryLearning    0.1744  0.0722  2.4166  90  0.0177   0.0310 
## Learning_vs_memoryMemory      0.1057  0.0619  1.7065  90  0.0914  -0.0174 
##                              ci.ub 
## Learning_vs_memoryLearning  0.3178  * 
## Learning_vs_memoryMemory    0.2288  . 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES1) 
##   R2_marginal R2_coditional 
##     0.0197648     0.9405080
LvsM_ES <- orchard_plot(mod_ES1, mod = "Learning_vs_memory", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

LvsM_ES 

Fig. 6a Orchard plot showing the group-wise means of the categorical variable ‘Learning_vs_memory’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Type of assay

The broad category of the type of assay used to measure learning or memory

VCV_ES1 <- impute_covariance_matrix(vi = dat1$lnRRV_ES, cluster = dat$Study_ID, r = 0.5)

mod_ES2 <- rma.mv(yi = lnRR_ESa, V = VCV_ES1, mod = ~Type_assay-1, random = list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                  test = "t",
                  data = dat1)

summary(mod_ES2)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0874   78.1748   90.1748  105.1066   91.1992   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0370  0.1924     30     no  Study_ID 
## sigma^2.2  0.0192  0.1386     92     no     ES_ID 
## sigma^2.3  0.0018  0.0422      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 293.9385, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.1062, p-val = 0.0305
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb   ci.ub 
## Type_assayConditioning    0.1525  0.0589   2.5877  89  0.0113   0.0354  0.2696 
## Type_assayHabituation     0.1990  0.1415   1.4070  89  0.1629  -0.0820  0.4801 
## Type_assayRecognition    -0.0048  0.0800  -0.0606  89  0.9518  -0.1637  0.1541 
##  
## Type_assayConditioning  * 
## Type_assayHabituation 
## Type_assayRecognition 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES2) 
##   R2_marginal R2_coditional 
##    0.05775809    0.97105550
Learning_ES <- orchard_plot(mod_ES2, mod = "Type_assay", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Learning_ES

Fig. 6b Orchard plot showing the group-wise means of the categorical variable ‘Type_assay’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Type of reinforcement

If conditioning was used, was aversive or appetitive reinforcement used?

VCV_ES2 <- impute_covariance_matrix(vi = dat2$lnRRV_ES, cluster = dat2$Study_ID, r = 0.5)

mod_ES3 <- rma.mv(yi = lnRR_ESa, V = VCV_ES2, mod = ~ Type_reinforcement-1, random = list(~1|Study_ID,
                                                                                               ~1|ES_ID,
                                                                                               ~1|Strain),
                  test = "t",
                  data = dat2)

summary(mod_ES3)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0604   78.1208   90.1208  105.0526   91.1452   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0382  0.1954     30     no  Study_ID 
## sigma^2.2  0.0189  0.1377     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 293.4724, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.2547, p-val = 0.0254
## 
## Model Results:
## 
##                                   estimate      se    tval  df    pval    ci.lb 
## Type_reinforcementAppetitive        0.1007  0.1075  0.9366  89  0.3515  -0.1129 
## Type_reinforcementAversive          0.1573  0.0569  2.7618  89  0.0070   0.0441 
## Type_reinforcementNot applicable    0.0147  0.0702  0.2101  89  0.8341  -0.1247 
##                                    ci.ub 
## Type_reinforcementAppetitive      0.3143     
## Type_reinforcementAversive        0.2704  ** 
## Type_reinforcementNot applicable  0.1541     
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES3) 
##   R2_marginal R2_coditional 
##     0.0586952     1.0000000
Reinforcement_ES <- orchard_plot(mod_ES3, mod = "Type_reinforcement", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Reinforcement_ES 

Fig. 6c Orchard plot showing the group-wise means of the categorical variable ‘Type_reinforcement’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Age of enrichment

The age when individuals were exposed to environmental enrichment

VCV_ES3 <- impute_covariance_matrix(vi = dat3$lnRRV_ES, cluster = dat3$Study_ID, r = 0.5)

mod_ES4 <- rma.mv(yi = lnRR_ESa, V = VCV_ES3, mod = ~Age_EE_exposure-1, random = list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                 test = "t",
                 data = dat3)

summary(mod_ES4) 
## 
## Multivariate Meta-Analysis Model (k = 88; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -36.6407   73.2813   83.2813   95.5531   84.0313   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0332  0.1822     29     no  Study_ID 
## sigma^2.2  0.0207  0.1439     88     no     ES_ID 
## sigma^2.3  0.0007  0.0265      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 86) = 288.6493, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 86) = 3.1308, p-val = 0.0487
## 
## Model Results:
## 
##                            estimate      se    tval  df    pval    ci.lb 
## Age_EE_exposureAdolescent    0.1284  0.0583  2.2006  86  0.0304   0.0124 
## Age_EE_exposureAdult         0.1247  0.0921  1.3538  86  0.1793  -0.0584 
##                             ci.ub 
## Age_EE_exposureAdolescent  0.2444  * 
## Age_EE_exposureAdult       0.3077    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES4) 
##   R2_marginal R2_coditional 
##  0.0000400928  0.9871095822
Age_enrichment_ES <- orchard_plot(mod_ES4, mod = "Age_EE_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Age_enrichment_ES

Fig. 6d Orchard plot showing the group-wise means of the categorical variable ‘Age_EE_exposure’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Exercise enrichment

Did enrichment involve the addition of apparatus for voluntary exercise (e.g., a wheel or treadmill)?

mod_ES5<- rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~EE_exercise-1, random = list(~1|Study_ID, 
    ~1|ES_ID,
    ~1|Strain),
     test = "t",
     data = dat)

summary(mod_ES5)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.4968   80.9935   90.9935  103.4926   91.7078   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0325  0.1803     30     no  Study_ID 
## sigma^2.2  0.0230  0.1517     92     no     ES_ID 
## sigma^2.3  0.0065  0.0805      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 297.3270, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 1.8401, p-val = 0.1647
## 
## Model Results:
## 
##                         estimate      se    tval  df    pval    ci.lb   ci.ub 
## EE_exerciseExercise       0.1051  0.0780  1.3474  90  0.1812  -0.0499  0.2602 
## EE_exerciseNo exercise    0.1687  0.0967  1.7448  90  0.0844  -0.0234  0.3609 
##  
## EE_exerciseExercise 
## EE_exerciseNo exercise  . 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES5) 
##   R2_marginal R2_coditional 
##    0.01474459    0.89712469
Exercise_ES <- orchard_plot(mod_ES5, mod = "EE_exercise", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Exercise_ES

Fig. 6d Orchard plot showing the group-wise means of the categorical variable ‘EE_exercise’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Social enrichment

Did enrichment involve more conspecifics (note that we did not include studies that only provided social enrichment but no other form of abiotic enrichment)?

VCV_ES4 <- impute_covariance_matrix(vi = dat4$lnRRV_ES, cluster = dat4$Study_ID, r = 0.5)
mod_ES6<- rma.mv(yi = lnRR_ESa, V = VCV_ES4, mod = ~EE_social-1, random = list(~1|Study_ID,
                                                                                ~1|ES_ID,
                                                                                ~1|Strain),
                 test = "t",
                 data = dat4)

summary(mod_ES6)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.1871   80.3742   90.3742  102.8733   91.0885   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0311  0.1762     30     no  Study_ID 
## sigma^2.2  0.0230  0.1518     92     no     ES_ID 
## sigma^2.3  0.0046  0.0676      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 302.0860, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 2.4198, p-val = 0.0947
## 
## Model Results:
## 
##                      estimate      se    tval  df    pval    ci.lb   ci.ub 
## EE_socialNon-social    0.0750  0.0807  0.9300  90  0.3549  -0.0853  0.2353    
## EE_socialSocial        0.1720  0.0788  2.1842  90  0.0315   0.0156  0.3285  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES6) 
##   R2_marginal R2_coditional 
##    0.03751906    0.92501263
Social_ES <- orchard_plot(mod_ES6, mod = "EE_social", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Social_ES

Fig. 6e Orchard plot showing the group-wise means of the categorical variable ‘EE_social’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Age of stress

The age when individuals were exposed to stress

mod_ES7 <-rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~Age_stress_exposure-1, random = list(~1|Study_ID,
                                                                                          ~1|ES_ID,
                                                                                          ~1|Strain),
                 test = "t",
                 data = dat)
summary(mod_ES7) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0917   78.1834   92.1834  109.5247   93.5834   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0295  0.1718     30     no  Study_ID 
## sigma^2.2  0.0232  0.1522     92     no     ES_ID 
## sigma^2.3  0.0091  0.0954      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 88) = 286.4225, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 88) = 1.5932, p-val = 0.1832
## 
## Model Results:
## 
##                                     estimate      se     tval  df    pval 
## Age_stress_exposureAdolescent        -0.0137  0.1762  -0.0775  88  0.9384 
## Age_stress_exposureAdult              0.1677  0.1140   1.4708  88  0.1449 
## Age_stress_exposureEarly postnatal    0.1067  0.0920   1.1602  88  0.2491 
## Age_stress_exposurePrenatal           0.3179  0.1311   2.4254  88  0.0173 
##                                       ci.lb   ci.ub 
## Age_stress_exposureAdolescent       -0.3639  0.3366    
## Age_stress_exposureAdult            -0.0589  0.3942    
## Age_stress_exposureEarly postnatal  -0.0761  0.2896    
## Age_stress_exposurePrenatal          0.0574  0.5784  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES7) 
##   R2_marginal R2_coditional 
##    0.09276574    0.86630830
Age_stress_ES<-orchard_plot(mod_ES7, mod = "Age_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34", "grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Age_stress_ES

Fig. 6d Orchard plot showing the group-wise means of the categorical variable ‘Age_stress_exposure’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Type of stress

The type of stressor used

VCV_ES5 <- impute_covariance_matrix(vi = dat5$lnRRV_ES, cluster = dat5$Study_ID, r = 0.5)
mod_ES8 <- rma.mv(yi = lnRR_ESa, V = VCV_ES5, mod = ~Type_stress_exposure-1, random = list(~1|Study_ID,
                                                                                            ~1|ES_ID,
                                                                                            ~1|Strain),
                  test = "t",
                  data = dat5)
summary(mod_ES8)
## 
## Multivariate Meta-Analysis Model (k = 85; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -34.4046   68.8091   82.8091   99.5703   84.3434   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0426  0.2064     25     no  Study_ID 
## sigma^2.2  0.0232  0.1524     85     no     ES_ID 
## sigma^2.3  0.0104  0.1021      4     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 81) = 281.9708, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 81) = 0.5137, p-val = 0.7258
## 
## Model Results:
## 
##                                  estimate      se    tval  df    pval    ci.lb 
## Type_stress_exposureCombination    0.1111  0.1458  0.7618  81  0.4484  -0.1790 
## Type_stress_exposureMS             0.1185  0.1099  1.0784  81  0.2840  -0.1001 
## Type_stress_exposureNoise          0.1651  0.1795  0.9198  81  0.3604  -0.1920 
## Type_stress_exposureRestraint      0.1374  0.1252  1.0978  81  0.2755  -0.1116 
##                                   ci.ub 
## Type_stress_exposureCombination  0.4011    
## Type_stress_exposureMS           0.3370    
## Type_stress_exposureNoise        0.5221    
## Type_stress_exposureRestraint    0.3865    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES8)
##   R2_marginal R2_coditional 
##   0.004455703   0.863910284
Stressor_ES <- orchard_plot(mod_ES8, mod = "Type_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34", "grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7))  

Stressor_ES 

Fig. 6e Orchard plot showing the group-wise means of the categorical variable ‘Type_stress_exposure’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Stress duration

Was the stress acute or chronic?

VCV_ES6 <- impute_covariance_matrix(vi = dat6$lnRRV_ES, cluster = dat6$Study_ID, r = 0.5)

mod_ES9 <-rma.mv(yi = lnRR_ESa, V = VCV_ES6, mod = ~Stress_duration-1, random = list(~1|Study_ID,
                                                                                      ~1|ES_ID,
                                                                                      ~1|Strain),
                 test = "t",
                 data = dat6)
summary(mod_ES9) 
## 
## Multivariate Meta-Analysis Model (k = 89; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -35.9010   71.8020   81.8020   94.1315   82.5427   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0133  0.1155     29     no  Study_ID 
## sigma^2.2  0.0260  0.1611     89     no     ES_ID 
## sigma^2.3  0.0080  0.0895      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 87) = 278.4877, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 87) = 4.3877, p-val = 0.0153
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb   ci.ub 
## Stress_durationAcute     -0.0367  0.0930  -0.3946  87  0.6941  -0.2216  0.1482 
## Stress_durationChronic    0.1854  0.0732   2.5347  87  0.0130   0.0400  0.3308 
##  
## Stress_durationAcute 
## Stress_durationChronic  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES9) 
##   R2_marginal R2_coditional 
##     0.1598311     0.8575918
Duration_ES<- orchard_plot(mod_ES9, mod = "Stress_duration", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Duration_ES

Fig. 6f Orchard plot showing the group-wise means of the categorical variable ‘Stress_duration’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Order to treatment exposure

The order in which individuals were exposed to enrichment and stress

mod_ES10 <- rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~Exposure_order -1, random = list(~1|Study_ID, 
    ~1|ES_ID,
    ~1|Strain),
     test = "t",
     data = dat)

summary(mod_ES10)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0408   78.0817   90.0817  105.0135   91.1061   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0316  0.1777     30     no  Study_ID 
## sigma^2.2  0.0227  0.1507     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 292.2561, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.1546, p-val = 0.0287
## 
## Model Results:
## 
##                                 estimate      se     tval  df    pval    ci.lb 
## Exposure_orderConcurrently        0.1492  0.1208   1.2351  89  0.2201  -0.0909 
## Exposure_orderEnrichment first   -0.1782  0.1659  -1.0744  89  0.2856  -0.5079 
## Exposure_orderStress first        0.1370  0.0526   2.6046  89  0.0108   0.0325 
##                                  ci.ub 
## Exposure_orderConcurrently      0.3893    
## Exposure_orderEnrichment first  0.1514    
## Exposure_orderStress first      0.2414  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES10)
##   R2_marginal R2_coditional 
##     0.1027207     1.0000000
Order_ES <- orchard_plot(mod_ES10, mod = "Exposure_order", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Order_ES 

Fig. 6g Orchard plot showing the group-wise means of the categorical variable ‘Exposure_order’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Publication bias & sensitivity analysis

Multi-moderator model

dat_ESfm <- dat %>%
    filter(Type_assay %in% c("Recognition", "Habituation", "Conditioning"), Type_reinforcement %in%
        c("Appetitive", "Aversive", "Not applicable"), EE_social %in% c("Social",
        "Non-social"), Age_EE_exposure %in% c("Adult", "Adolescent"), Type_stress_exposure %in%
        c("Restraint", "Noise", "MS", "Combination"), Stress_duration %in% c("Chronic",
        "Acute"), Age_stress_exposure %in% c("Prenatal", "Early postnatal", "Adult"))

VCV_ESfm <- impute_covariance_matrix(vi = dat_ESfm$lnRRV_ES, cluster = dat_ESfm$Study_ID,
    r = 0.5)

mod_ESfm <- rma.mv(yi = lnRR_Sa, V = VCV_ESfm, mod = ~Type_assay - 1 + Learning_vs_memory +
    Type_reinforcement + EE_social + EE_exercise + Age_EE_exposure + Type_stress_exposure +
    Age_stress_exposure + Stress_duration + Exposure_order, random = list(~1 | Study_ID,
    ~1 | ES_ID, ~1 | Strain), test = "t", data = dat_ESfm)
# summary(mod_ESfm) r2_ml(mod_ESfm)


res_ESfm <- dredge(mod_ESfm, trace = 2)
saveRDS(res_ESfm, file = here("Rdata", "res_ESfm.rds"))
# also saving the full model and data
saveRDS(mod_ESfm, file = here("Rdata", "mod_ESfm.rds"))
saveRDS(dat_ESfm, file = here("Rdata", "dat_ESfm.rds"))

The akaike weights for the top set of models with AIC < 6

dat_ESfm <- readRDS(file = here("Rdata", "dat_ESfm.rds"))
mod_ESfm <- readRDS(file = here("Rdata", "mod_ESfm.rds"))
res_ESfm <- readRDS(file = here("Rdata", "res_ESfm.rds"))
res_ESfm2 <- subset(res_ESfm, delta <= 6, recalc.weights = FALSE)
importance(res_ESfm2)
##                      Type_assay Stress_duration Age_EE_exposure EE_exercise
## Sum of weights:      0.65       0.63            0.26            0.11       
## N containing models:   19         18               7               6       
##                      Learning_vs_memory EE_social Age_stress_exposure
## Sum of weights:      0.08               0.08      0.05               
## N containing models:    4                  4         2               
##                      Type_stress_exposure Exposure_order
## Sum of weights:      0.03                 0.02          
## N containing models:    2                    1

Funnel plot

Used to produce Fig. 7c

Funnel_ES <- funnel(mod_ESfm, xlab = "lnRR", ylab = "Standard Error")

Funnel_ES
##               x          y slab
## 1  -0.160575495 0.55343043    1
## 2  -0.274967420 0.70627539    2
## 3  -0.089909776 0.46527295    3
## 4  -0.418899318 0.36571674    4
## 5  -0.402782263 0.53501323    5
## 6  -0.058704027 0.45431531    6
## 7   0.098710844 0.15778981    7
## 8  -0.041805142 0.11742065    8
## 9  -0.234568128 0.44509952    9
## 10  0.473861619 0.42494140   10
## 11 -0.541677850 0.59839672   11
## 12  0.693576469 0.55379623   12
## 13 -0.506062429 0.32349206   13
## 14 -0.434662931 0.29560170   14
## 15 -0.752838102 0.41427250   15
## 16 -0.403661524 0.38640076   16
## 17 -0.074888497 0.14501213   17
## 18 -0.016611205 0.15220818   18
## 19  0.208016615 0.31484827   19
## 20  0.066418083 0.06641794   20
## 21 -0.016988105 0.13630983   21
## 22  0.102490150 0.27788492   22
## 23  0.077633012 0.12209543   23
## 24  0.265433711 0.18060215   24
## 25  0.549569896 0.20386929   25
## 26  0.029904759 0.23531678   26
## 27  0.036477985 0.10420416   27
## 28  0.033071595 0.10236053   28
## 29  0.154387233 0.13226659   29
## 30  0.068347398 0.10358055   30
## 31 -0.066651554 0.06766794   31
## 32  0.180810374 0.14954583   32
## 33 -0.116381761 0.30939379   33
## 34  0.008432825 0.12562534   34
## 35  0.040870354 0.17488050   35
## 36  0.039701546 0.09315773   36
## 37  0.119572535 0.09839159   37
## 38  0.083631129 0.10349806   38
## 39  0.151879757 0.14903289   39
## 40  0.120985979 0.10446433   40
## 41  0.031045847 0.10043162   41
## 42  0.118346228 0.11005125   42
## 43  0.155471736 0.12842298   43
## 44 -0.100968105 0.08874519   44
## 45  0.044022534 0.07229828   45
## 46  0.101114679 0.16689703   46
## 47  0.203773608 0.15471161   47
## 48  0.088563198 0.17334032   48
## 49 -0.005169248 0.17866865   49
## 50  0.434942304 0.36859082   50
## 51  0.554127069 0.73098123   51
## 52 -0.616979476 0.68762297   52
## 53 -0.364466901 0.25174124   53
## 54 -0.304033204 0.52455475   54
## 55  0.230466950 0.44507651   55
## 56 -0.314501446 0.47347958   56
## 57 -0.044976662 0.10592411   57
## 58  0.088941840 0.09196930   58
## 59 -0.100897815 0.73013998   59
## 60  0.510285555 0.59479999   60
## 61  0.451655914 0.34843255   61
## 62  0.479984384 0.70816567   62
## 63 -0.204829048 0.32322526   63
## 64 -0.079911943 0.14926781   64
## 65  0.065631803 0.33253908   65
## 66  0.186788247 0.09926520   66
## 67 -0.216336366 0.15728452   67
## 68 -0.069183632 0.12020637   68
## 69 -0.074226124 0.44173325   69
## 70  0.038912354 0.12603637   70
## 71  0.441601579 1.08275832   71
## 72 -0.149920957 0.21396887   72
## 73  0.302424799 1.01869334   73
## 74  0.205736931 0.09751054   74

Fig.7c Funnel plot showing the standard error and residuals (lnRR) from the full model.

Leave-one-out analysis

dat$Study_ID <- as.factor(dat$Study_ID)

LeaveOneOut_effectsize <- list()
for (i in 1:length(levels(dat$Study_ID))) {
    d <- dat %>%
        filter(Study_ID != levels(dat$Study_ID)[i])

    VCV_ESb <- impute_covariance_matrix(vi = d$lnRRV_ES, cluster = d$Study_ID, r = 0.5)
    LeaveOneOut_effectsize[[i]] <- rma.mv(yi = lnRR_ESa, V = VCV_ESb, random = list(~1 |
        Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", data = dat[dat$Study_ID !=
        levels(dat$Study_ID)[i], ])
}


# writing function for extracting est, ci.lb, and ci.ub from all models
est.func <- function(mod_ES0) {
    df <- data.frame(est = mod_ES0$b, lower = mod_ES0$ci.lb, upper = mod_ES0$ci.ub)
    return(df)
}


# using dplyr to form data frame
MA_CVR_ES <- lapply(LeaveOneOut_effectsize, function(x) est.func(x)) %>%
    bind_rows %>%
    mutate(left_out = levels(dat$Study_ID))

saveRDS(MA_CVR_ES, , file = here("Rdata", "MA_CVR_ES.rds"))

Used to produce Fig. S5

MA_CVR_ES <- readRDS(here("Rdata", "MA_CVR_ES.rds"))

# telling ggplot to stop reordering factors
MA_CVR_ES$left_out <- as.factor(MA_CVR_ES$left_out)
MA_CVR_ES$left_out <- factor(MA_CVR_ES$left_out, levels = MA_CVR_ES$left_out)

# plotting
leaveoneout_ES <- ggplot(MA_CVR_ES) + geom_hline(yintercept = 0, lty = 2, lwd = 1) +
    geom_hline(yintercept = mod_ES0$ci.lb, lty = 3, lwd = 0.75, colour = "black") +
    geom_hline(yintercept = mod_ES0$b, lty = 1, lwd = 0.75, colour = "black") + geom_hline(yintercept = mod_ES0$ci.ub,
    lty = 3, lwd = 0.75, colour = "black") + geom_pointrange(aes(x = left_out, y = est,
    ymin = lower, ymax = upper)) + xlab("Study left out") + ylab("lnRR, 95% CI") +
    coord_flip() + theme(panel.grid.minor = element_blank()) + theme_bw() + theme(panel.grid.major = element_blank()) +
    theme(panel.grid.minor.x = element_blank()) + theme(axis.text.y = element_text(size = 6))

leaveoneout_ES

dat$Study_ID <- as.integer(dat$Study_ID)

Fig. S5 Leave-one-group-out analysis showing meta-analytic mean and 95% CI when each individual study is removed from the data set.

Using SMD

Re-rerunning meta-analytic model using standardised mean difference (SMD) instead of lnR

mod_ES0a <- rma.mv(yi = SMD_ESa, V = VCV_ESa, random = list(~1 | Study_ID, ~1 | ES_ID,
    ~1 | Strain), test = "t", data = dat)
summary(mod_ES0a)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##    logLik   Deviance        AIC        BIC       AICc 
## -126.0571   252.1141   260.1141   270.1576   260.5793   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.4653  0.6821     30     no  Study_ID 
## sigma^2.2  0.3698  0.6081     92     no     ES_ID 
## sigma^2.3  0.0000  0.0002      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 257.4673, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.6880  0.1763  3.9017  91  0.0002  0.3377  1.0382  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_ES0a)
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 6.657130e-01 3.709364e-01 2.947766e-01 3.351907e-08

‘Pairwise’ effect sizes

Enrichment relative to control

VCV_E20 <- impute_covariance_matrix(vi = dat$lnRRV_E2, cluster = dat$Study_ID, r = 0.5)

mod_E20 <- rma.mv(yi = lnRR_E2a, V = VCV_E20, random = list(~1 | Study_ID, ~1 | Strain,
    ~1 | ES_ID), test = "t", data = dat, control = list(optimizer = "optim", optmethod = "Nelder-Mead"))

summary(mod_E20)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -7.3235   14.6470   22.6470   32.6904   23.1121   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0037  0.0611     30     no  Study_ID 
## sigma^2.2  0.0000  0.0000      6     no    Strain 
## sigma^2.3  0.0281  0.1675     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 475.8327, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.1066  0.0291  3.6655  91  0.0004  0.0489  0.1644  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E20)
##     I2_total  I2_Study_ID    I2_Strain     I2_ES_ID 
## 8.610789e-01 1.011724e-01 2.607945e-09 7.599065e-01
orchard_plot(mod_E20, mod = "Int", xlab = "lnRR")

Stress relative to control

VCV_S20 <- impute_covariance_matrix(vi = dat$lnRRV_S2, cluster = dat$Study_ID, r = 0.5)

mod_S20 <- rma.mv(yi = lnRR_S2a, V = VCV_S20, random = list(~1 | Study_ID, ~1 | Strain,
    ~1 | ES_ID), test = "t", data = dat)

summary(mod_S20)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -52.3561  104.7122  112.7122  122.7557  113.1773   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0323  0.1797     30     no  Study_ID 
## sigma^2.2  0.0000  0.0000      6     no    Strain 
## sigma^2.3  0.0798  0.2824     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 1003.0694, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb    ci.ub 
##  -0.1846  0.0522  -3.5360  91  0.0006  -0.2882  -0.0809  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S20)
##     I2_total  I2_Study_ID    I2_Strain     I2_ES_ID 
## 9.489604e-01 2.734220e-01 9.879730e-10 6.755384e-01
orchard_plot(mod_S20, mod = "Int", xlab = "lnRR")

Enrichment + stress relative to control

VCV_ES20 <- impute_covariance_matrix(vi = dat$lnRRV_ES2, cluster = dat$Study_ID,
    r = 0.5)

mod_ES20 <- rma.mv(yi = lnRR_ES2a, V = VCV_ES20, random = list(~1 | Study_ID, ~1 |
    Strain, ~1 | ES_ID), test = "t", data = dat)
summary(mod_ES20)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -10.3625   20.7250   28.7250   38.7684   29.1901   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0039  0.0625     30     no  Study_ID 
## sigma^2.2  0.0014  0.0377      6     no    Strain 
## sigma^2.3  0.0227  0.1508     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 402.2656, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.0801  0.0389  2.0594  91  0.0423  0.0028  0.1573  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_ES20)
##    I2_total I2_Study_ID   I2_Strain    I2_ES_ID 
##  0.81513970  0.11355557  0.04132363  0.66026050
orchard_plot(mod_ES20, mod = "Int", xlab = "lnRR")

Enrichment + stress relative to stress

VCV_E30 <- impute_covariance_matrix(vi = dat$lnRRV_E3, cluster = dat$Study_ID, r = 0.5)

mod_E30 <- rma.mv(yi = lnRR_E3a, V = VCV_E30, random = list(~1 | Study_ID, ~1 | Strain,
    ~1 | ES_ID), test = "t", data = dat)
summary(mod_E30)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -46.3447   92.6895  100.6895  110.7329  101.1546   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0235  0.1532     30     no  Study_ID 
## sigma^2.2  0.0263  0.1623      6     no    Strain 
## sigma^2.3  0.0543  0.2331     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 790.0249, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.2465  0.1011  2.4389  91  0.0167  0.0457  0.4472  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E30)
##    I2_total I2_Study_ID   I2_Strain    I2_ES_ID 
##   0.9456920   0.2132063   0.2391809   0.4933048
orchard_plot(mod_E30, mod = "Int", xlab = "lnRR")

Enrichment + stress relative to enrichment

VCV_S30 <- impute_covariance_matrix(vi = dat$lnRRV_S3, cluster = dat$Study_ID, r = 0.5)

mod_S30 <- rma.mv(yi = lnRR_S3a, V = VCV_S30, random = list(~1 | Study_ID, ~1 | Strain,
    ~1 | ES_ID), test = "t", data = dat, control = list(optimizer = "optim", optmethod = "Nelder-Mead"))
summary(mod_S30)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -6.8788   13.7576   21.7576   31.8011   22.2228   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0000  0.0000     30     no  Study_ID 
## sigma^2.2  0.0009  0.0292      6     no    Strain 
## sigma^2.3  0.0276  0.1662     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 540.3522, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb   ci.ub 
##  -0.0087  0.0342  -0.2552  91  0.7992  -0.0766  0.0592    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S30)
##     I2_total  I2_Study_ID    I2_Strain     I2_ES_ID 
## 8.415428e-01 5.192043e-09 2.515933e-02 8.163835e-01
orchard_plot(mod_S30, mod = "Int", xlab = "lnRR")

Figures

Panel of ‘focal’ ES and ‘pairwise’ ES orchard plots

Used to produce Fig. 3

mod_list1 <- list(mod_E0, mod_S0, mod_ES0)

mod_res1 <- lapply(mod_list1, function(x) mod_results(x, mod = "Int"))

merged1 <- submerge(mod_res1[[3]], mod_res1[[2]],  mod_res1[[1]], mix = T)
merged1$mod_table$name <- factor(merged1$mod_table$name, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3"), 
    labels = rev(c("Enrichment ME", "Stress ME", "Interaction")))

merged1$data$moderator <- factor(merged1$data$moderator, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3"), 
    labels = rev(c("Enrichment ME", "Stress ME", "Interaction")))

orchard1<- orchard_plot(merged1, mod = "Int", xlab = "lnRR", angle = 0) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals 
  xlim(-2,4.5) +
  geom_point(aes(fill = name),  size = 4, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling +
  scale_colour_manual(values = c("#00AEEF","#00A651","#ED1C24"))+ # change colours
  scale_fill_manual(values=c("#00AEEF","#00A651","#ED1C24"))+
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 
mod_list2 <- list(mod_S30, mod_E30, mod_ES20, mod_S20, mod_E20) #rearranged the order so that it matches intext results

mod_res2 <- lapply(mod_list2, function(x) mod_results(x, mod = "Int"))

merged2 <- submerge(mod_res2[[1]], mod_res2[[2]],  mod_res2[[3]], mod_res2[[4]],  mod_res2[[5]], mix = T)

merged2$mod_table$name <- factor(merged2$mod_table$name, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3", "Intrcpt4", "Intrcpt5"), 
    labels = rev(c("EC/CC", "CS/CC", "ES/CC", "ES/CS", "ES/EC")))

merged2$data$moderator <- factor(merged2$data$moderator, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3", "Intrcpt4", "Intrcpt5"), 
    labels = rev(c("EC/CC", "CS/CC", "ES/CC", "ES/CS", "ES/EC")))

orchard2 <- orchard_plot(merged2, mod = "Int", xlab = "lnRR", angle = 0) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals 
  xlim(-2,4.5) +
  geom_point(aes(fill = name),  size = 4, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  scale_colour_manual(values = c("#7B81BE","#D7DF23","#F37158","#75CBF2","#97D2B4"))+ # change colours
  scale_fill_manual(values=c("#7B81BE","#D7DF23","#F37158","#75CBF2","#97D2B4"))+
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 
p1 <- orchard1 + orchard2 + plot_annotation(tag_levels = "A")
p1

# saved as PDF: 6 x 15 inches

Fig. 3 Orchard plots showing the eight meta-analytic models. (A) main effects of enrichment and stress, and interaction of environmental enrichment and stress, (B) ‘pairwise’ comparisons between treatments and controls. Thick black lines = 95% CI, thin black lines = 95 % PI.

Panel of meta-regressions

Environmental enrichment

Used to produce Fig. 4

# Enrichment
E_mod <- (LvsM_E + Learning_E + Reinforcement_E)/(Age_E + Exercise_E + Social_E) +
    plot_annotation(tag_levels = "A")

E_mod

# saved as pdf 10 x 15 inches

Fig. 4 Orchard plots showing the six different meta-regressions on the main effect of environmental enrichment on learning and memory. (A) learning versus memory response, (B) the type of assay, (C) the type of reinforcement, (D) the age at environmental enrichment, (E) type of manipulation of exercise during enrichment, (F) manipulation of the social environment during enrichment.

Stress

Used to produce Fig. 5

S_mod <- (LvsM_S + Learning_S + Reinforcement_S)/(Age_S + Stressor + Duration_S) +
    plot_annotation(tag_levels = "A")

S_mod

# saved as pdf 10 x 15 inches

Fig. 5 Orchard plots showing the six different meta-regressions on the main effect of stress on learning and memory. (A) learning versus memory response, (B) the type of assay, (C) the type of reinforcement, (D) the age at stress, (E) the type of stressor (MS = maternal separation), (F) chronic or acute stress.

Interaction

Used to produce Fig. 6

ES_mod <- plot_grid(LvsM_ES, Learning_ES, Reinforcement_ES, Age_enrichment_ES, Age_stress_ES,
    Order_ES, Exercise_ES, Social_ES, Stressor_ES, Duration_ES, labels = "AUTO",
    ncol = 5)

ES_mod

# saved as 10 x 20 inches

Fig. 6 Orchard plots showing the 10 different meta-regressions of moderators on the interaction between environmental enrichment and stress learning and memory. (A) learning versus memory response, (B) the type of assay, (C) the type of reinforcement used, (D) the age at environmental enrichment, (E) the age at stress, (F) the order of treatment exposure, (G) if enrichment involved a manipulation of exercise, (H) manipulation of the social environment during enrichment, (I) the type of stressor, (F) stress was chronic or acute.

Panel of funnel plots

Used to produce Fig. 7

# EE

pdf(NULL)
dev.control(displaylist = "enable")
par(mar = c(4, 4, 0.1, 0))
A <- funnel(mod_Sfm, xlab = "Residuals (lnRR)", ylab = "Standard Error", xlim = c(-2,
    2), ylim = c(0, 1.05))
A <- recordPlot()
invisible(dev.off())

# Stress

pdf(NULL)
dev.control(displaylist = "enable")
par(mar = c(4, 4, 0.1, 0))
B <- funnel(mod_Sfm, xlab = "Residuals (lnRR)", ylab = "Standard Error", xlim = c(-2,
    2), ylim = c(0, 1.05))
B <- recordPlot()
invisible(dev.off())

# Interaction
pdf(NULL)
dev.control(displaylist = "enable")
par(mar = c(4, 4, 0.1, 0))
C <- funnel(mod_ESfm, xlab = "Residuals (lnRR)", ylab = "Standard Error", xlim = c(-2,
    2), ylim = c(0, 1.05))
C <- recordPlot()
invisible(dev.off())

# putting together
ggdraw(A) + ggdraw(B) + ggdraw(C) + plot_annotation(tag_levels = "A")

# png(file = here('figs', 'Fig7_Funnels.png'))

# dev.off()
knitr::include_graphics(here("figs", "funnels.png"))

Fig. 7 Funnel plots of the standard error and residuals (lnRR) from the full models. (A) environmental enrichment main effect, (B) stress main effect, (C) environmental enrichment x stress interaction.

Software and package versions

sessionInfo() %>%
    pander()

R version 4.1.0 (2021-05-18)

Platform: x86_64-apple-darwin17.0 (64-bit)

locale: en_AU.UTF-8||en_AU.UTF-8||en_AU.UTF-8||C||en_AU.UTF-8||en_AU.UTF-8

attached base packages: grid, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: formatR(v.1.11), pander(v.0.6.4), gridGraphics(v.0.5-1), png(v.0.1-7), cowplot(v.1.1.1), ggthemr(v.1.1.0), ggalluvial(v.0.12.3), visdat(v.0.5.3), networkD3(v.0.4), GoodmanKruskal(v.0.0.3), patchwork(v.1.1.1), MuMIn(v.1.43.17), orchaRd(v.0.0.0.9000), clubSandwich(v.0.5.3), metafor(v.3.0-2), Matrix(v.1.3-3), here(v.1.0.1), forcats(v.0.5.1), stringr(v.1.4.0), dplyr(v.1.0.6), purrr(v.0.3.4), readr(v.1.4.0), tidyr(v.1.1.3), tibble(v.3.1.2), ggplot2(v.3.3.3) and tidyverse(v.1.3.1)

loaded via a namespace (and not attached): nlme(v.3.1-152), fs(v.1.5.0), lubridate(v.1.7.10), RColorBrewer(v.1.1-2), httr(v.1.4.2), rprojroot(v.2.0.2), tools(v.4.1.0), backports(v.1.2.1), utf8(v.1.2.1), R6(v.2.5.0), vipor(v.0.4.5), DBI(v.1.1.1), colorspace(v.2.0-1), withr(v.2.4.2), tidyselect(v.1.1.1), compiler(v.4.1.0), cli(v.2.5.0), rvest(v.1.0.0), pacman(v.0.5.1), xml2(v.1.3.2), sandwich(v.3.0-1), labeling(v.0.4.2), bookdown(v.0.22), scales(v.1.1.1), digest(v.0.6.27), rmarkdown(v.2.8), pkgconfig(v.2.0.3), htmltools(v.0.5.1.1), highr(v.0.9), dbplyr(v.2.1.1), htmlwidgets(v.1.5.3), rlang(v.0.4.11), readxl(v.1.3.1), rstudioapi(v.0.13), farver(v.2.1.0), generics(v.0.1.0), zoo(v.1.8-9), jsonlite(v.1.7.2), magrittr(v.2.0.1), ggbeeswarm(v.0.6.0), Rcpp(v.1.0.6), munsell(v.0.5.0), fansi(v.0.4.2), lifecycle(v.1.0.0), stringi(v.1.6.2), yaml(v.2.2.1), mathjaxr(v.1.4-0), crayon(v.1.4.1), lattice(v.0.20-44), haven(v.2.4.1), hms(v.1.1.0), knitr(v.1.33), pillar(v.1.6.1), igraph(v.1.2.6), codetools(v.0.2-18), stats4(v.4.1.0), reprex(v.2.0.0), glue(v.1.4.2), evaluate(v.0.14), modelr(v.0.1.8), vctrs(v.0.3.8), rmdformats(v.1.0.2), cellranger(v.1.1.0), gtable(v.0.3.0), assertthat(v.0.2.1), xfun(v.0.23), broom(v.0.7.6), beeswarm(v.0.4.0) and ellipsis(v.0.3.2)

LS0tCnRpdGxlOiAiRW5yaWNobWVudCB4IHN0cmVzcyBNQSIKYXV0aG9yczogIkVyaW4gTCBNYWNhcnRuZXksIE1hbGdvcnphdGEgTGFnaXN6LCBTaGluaWNoaSBOYWthZ2F3YSIKc3VidGl0bGU6IFN1cHBsZW1lbnRhcnkgTWF0ZXJpYWwKb3V0cHV0OiAKICAgIAogICAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQogICMgb3V0cHV0OgojICAgaHRtbF9kb2N1bWVudDoKIyAgICAgY29kZV9mb2xkaW5nOiBoaWRlCiMgICAgIGRmX3ByaW50OiBrYWJsZQojICAgICB0b2M6IFRSVUUKIyAgICAgdG9jX2Zsb2F0OiBUUlVFCiMgICAgIHRvY19kZXB0aDogNAojICAgICBjb2xsYXBzZWQ6IEZBTFNFCiMgICAgIFlBTUw6IHJtZGZvcm1hdHM6OnJvYm9ib29rCi0tLQoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAptZXNzYWdlID0gRkFMU0UsCndhcm5pbmcgPSBGQUxTRSwKY2FjaGUgPSBUUlVFLCAKdGlkeSA9IFRSVUUsIAplY2hvID0gVFJVRQopCgpybShsaXN0ID0gbHMoKSkKYGBgCgojIFNldHRpbmctdXAgey50YWJzZXR9CgojIyBMb2FkaW5nIHBhY2thZ2VzCgpgYGB7ciwgY2FjaGUgPSBGQUxTRX0KCiNkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoJ01pa2F0YS1Qcm9qZWN0L2dndGhlbXInLCBmb3JjZSA9IFRSVUUpIAoKcGFjbWFuOjpwX2xvYWQodGlkeXZlcnNlLCAKICAgICAgICAgICAgICAgaGVyZSwKICAgICAgICAgICAgICAgbWV0YWZvciwKICAgICAgICAgICAgICAgY2x1YlNhbmR3aWNoLAogICAgICAgICAgICAgICBvcmNoYVJkLCAKICAgICAgICAgICAgICAgTXVNSW4sCiAgICAgICAgICAgICAgIHBhdGNod29yaywKICAgICAgICAgICAgICAgR29vZG1hbktydXNrYWwsCiAgICAgICAgICAgICAgIG5ldHdvcmtEMywKICAgICAgICAgICAgICAgZ2dwbG90MiwKICAgICAgICAgICAgICAgdmlzZGF0LAogICAgICAgICAgICAgICBnZ2FsbHV2aWFsLAogICAgICAgICAgICAgICBnZ3RoZW1yLCAKICAgICAgICAgICAgICAgY293cGxvdCwKICAgICAgICAgICAgICAgZ3JEZXZpY2VzLAogICAgICAgICAgICAgICBwbmcsCiAgICAgICAgICAgICAgIGdyaWQsCiAgICAgICAgICAgICAgIGdyaWRHcmFwaGljcywKICAgICAgICAgICAgICAgcGFuZGVyLAogICAgICAgICAgICAgICBmb3JtYXRSKQojIG5lZWRlZCBmb3IgbW9kZWwgc2VsZWN0aW9uIHVzaW5nIE11TUluIHdpdGhpbiBtZXRhZm9yCmV2YWwobWV0YWZvcjo6Oi5NdU1JbikKCmBgYAoKIyMgTG9hZGluZyBkYXRhIGFuZCBmdW5jdGlvbnMKVGhpcyBsb2FkcyB0aGUgdW5wcm9jZXNzZWQgZGF0YWZpbGUgYW5kIGN1c3RvbSBmdW5jdGlvbnMgaW5jbHVkaW5nCgotIGNhbGN1bGF0aW5nICdmb2NhbCcgYW5kICdwYWlyLXdpc2UnIGVmZmVjdCBzaXplcyBhbmQgdmFyaWFuY2UKLSBjYWxjdWxhdGluZyBTTUQKLSBjcmVhdGluZyBWQ1Ygb2YgdmFyaWFuY2UKCmBgYHtyLCBjYWNoZSA9IEZBTFNFfQpkYXQgPC0gcmVhZF9jc3YoaGVyZSgiRGF0YSIsIkRhdGFfcmF3LmNzdiIpKQojIExvYWQgY3VzdG9tIGZ1bmN0aW9uIHRvIGV4dHJhY3QgZGF0YSAKc291cmNlKGhlcmUoIlIvRnVuY3Rpb25zLlIiKSkgCmBgYAoKIyMgRGF0YSBvcmdhbmlzYXRpb24KLSByZW1vdmluZyBzdHVkeSAoV2FuZyBldCBhbF8yMDIwKSB3aXRoIG5lZ2F0aXZlIHZhbHVlcyBhcyBsblJSIGNhbm5vdCBiZSBjYWxjdWxhdGVkIHdpdGggbmVnYXRpdmUgdmFsdWVzCi0gcm91bmRpbmcgZG93biBzYW1wbGUgc2l6ZXMgdGhhdCBhcmUgcmVwb3J0ZWQgYXMgZGVjaW1hbHMgZHVlIHRvIGF2ZXJhZ2luZyBuIGFjcm9zcyB0cmVhdG1lbnRzCi0gZ2V0dGluZyBlZmZlY3Qgc2l6ZXMgZnJvbSBmdW5jdGlvbgotICdmbGlwcGluZycgZWZmZWN0IHNpemVzIHNvIHRoYXQgYWxsIGVmZmVjdCBzaXplcyBhcmUgaGlnaGVyIHZhbHVlcyA9IGluZGl2aWR1YWxzIGRvIGJldHRlciBpbiBjb2duaXRpdmUgYXNzYXlzCi0gYXNzaWduaW5nIGh1bWFuIHJlYWRhYmxlIHRlcm1zLCBhbmQgY3JlYXRpbmcgVkNWIG9mIHZhcmlhbmNlIAoKYGBge3J9CgojIHJlbW92aW5nIHN0dWR5IHdpdGggbmVnYXRpdmUgdmFsdWVzIGFzIHRoZXNlIGFyZSB1bmFibGUgdG8gYmUgdXNlZCBmb3IgbG5SUgpkYXQgPC0gZHJvcGxldmVscyhkYXRbIWRhdCRGaXJzdF9hdXRob3IgPT0gJ1dhbmcnLF0pCgojcm91bmRpbmcgZG93biBzYW1wbGUgc2l6ZXMKZGF0JENDX24gPC0gZmxvb3IoZGF0JENDX24pCmRhdCRFQ19uIDwtIGZsb29yKGRhdCRFQ19uKQpkYXQkQ1NfbiA8LSBmbG9vcihkYXQkQ1NfbikKZGF0JEVTX24gPC0gZmxvb3IoZGF0JENTX24pCgojICdGb2NhbCcgZWZmZWN0X3NpemUgCmVmZmVjdF9zaXplIDwtIHdpdGgoZGF0LCBtYXBwbHkoZWZmZWN0X3NldCwgCiAgICAgICAgICAgICAgICAgICAgICBDQ19uICwKICAgICAgICAgICAgICAgICAgICAgIENDX21lYW4sIAogICAgICAgICAgICAgICAgICAgICAgQ0NfU0QsCiAgICAgICAgICAgICAgICAgICAgICBFQ19uLCAKICAgICAgICAgICAgICAgICAgICAgIEVDX21lYW4sIAogICAgICAgICAgICAgICAgICAgICAgRUNfU0QsCiAgICAgICAgICAgICAgICAgICAgICBDU19uLCAKICAgICAgICAgICAgICAgICAgICAgIENTX21lYW4sIAogICAgICAgICAgICAgICAgICAgICAgQ1NfU0QsCiAgICAgICAgICAgICAgICAgICAgICBFU19uLCAKICAgICAgICAgICAgICAgICAgICAgIEVTX21lYW4sIAogICAgICAgICAgICAgICAgICAgICAgRVNfU0QsCiAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50ID0gUmVzcG9uc2VfcGVyY2VudCwKICAgICAgICAgICAgICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpKQplZmZlY3Rfc2l6ZSA8LSBtYXBfZGZyKGVmZmVjdF9zaXplLCBJKQoKIyAnUGFpcndpc2UnIGVmZmVjdCBzaXplCiBlZmZlY3Rfc2l6ZTIgPC0gd2l0aChkYXQsIG1hcHBseShlZmZlY3Rfc2V0MiwgCiAgICAgICAgICAgICAgICAgICAgICBDQ19uICwKICAgICAgICAgICAgICAgICAgICAgIENDX21lYW4sIAogICAgICAgICAgICAgICAgICAgICAgQ0NfU0QsCiAgICAgICAgICAgICAgICAgICAgICBFQ19uLCAKICAgICAgICAgICAgICAgICAgICAgIEVDX21lYW4sIAogICAgICAgICAgICAgICAgICAgICAgRUNfU0QsCiAgICAgICAgICAgICAgICAgICAgICBDU19uLCAKICAgICAgICAgICAgICAgICAgICAgIENTX21lYW4sIAogICAgICAgICAgICAgICAgICAgICAgQ1NfU0QsCiAgICAgICAgICAgICAgICAgICAgICBFU19uLCAKICAgICAgICAgICAgICAgICAgICAgIEVTX21lYW4sIAogICAgICAgICAgICAgICAgICAgICAgRVNfU0QsCiAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50ID0gUmVzcG9uc2VfcGVyY2VudCwKICAgICAgICAgICAgICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpKQplZmZlY3Rfc2l6ZTIgPC0gbWFwX2RmcihlZmZlY3Rfc2l6ZTIsIEkpCgpmdWxsX2luZm8gPC0gd2hpY2goY29tcGxldGUuY2FzZXMoZWZmZWN0X3NpemUpID09IFRSVUUpCgojIGFkZGluZyBlZmZlY3Qgc2l6ZXMgYXMgY29sdW1uCmRhdCA8LSBiaW5kX2NvbHMoZGF0LCBlZmZlY3Rfc2l6ZSwgZWZmZWN0X3NpemUyKQpkYXQgPC0gZGF0W2Z1bGxfaW5mbywgXQoKI0ZsaXBwaW5nICdsb3dlciBpcyBiZXR0ZXInIHRvICdoaWdoZXIgaXMgYmV0dGVyJyBlZmZlY3Qgc2l6ZXMKI2ZsaXBwaW5nIGxuUlIgZm9yIHZhbHVlcyB3aGVyZSBoaWdoZXIgPSB3b3JzZQpkYXQkbG5SUl9FYSA8LSBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkbG5SUl9FKi0xLGlmZWxzZShpcy5uYShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uKSA9PSBUUlVFLCBOQSwgZGF0JGxuUlJfRSkpCiMgY3VycmVudGx5IE5Bc3doaWNoIGNhdXNlcyBlcnJvcgpkYXQkbG5SUl9TYSAgPC0gaWZlbHNlKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24gPT0gMiwgZGF0JGxuUlJfUyotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRsblJSX1MpKSAjIGN1cnJlbnRseSBOQXN3aGljaCBjYXVzZXMgZXJyb3IKZGF0JGxuUlJfRVNhIDwtICBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkbG5SUl9FUyotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRsblJSX0VTKSkgIyBjdXJyZW50bHkgTkFzd2hpY2ggY2F1c2VzIGVycm9yCiNmbGlwcGluZyAncHVyZSBlZmZlY3Qgc2l6ZXMnCmRhdCRsblJSX0UyYSA8LSBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkbG5SUl9FMiotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRsblJSX0UyKSkgIyBjdXJyZW50bHkgTkFzd2hpY2ggY2F1c2VzIGVycm9yCmRhdCRsblJSX1MyYSAgPC0gaWZlbHNlKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24gPT0gMiwgZGF0JGxuUlJfUzIqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkbG5SUl9TMikpICMgY3VycmVudGx5IE5Bc3doaWNoIGNhdXNlcyBlcnJvcgpkYXQkbG5SUl9FUzJhIDwtICBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkbG5SUl9FUzIqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkbG5SUl9FUzIpKSAjIGN1cnJlbnRseSBOQXN3aGljaCBjYXVzZXMgZXJyb3IKZGF0JGxuUlJfRTNhIDwtICBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkbG5SUl9FMyotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRsblJSX0UzKSkgIyBjdXJyZW50bHkgTkFzd2hpY2ggY2F1c2VzIGVycm9yCmRhdCRsblJSX1MzYSA8LSAgaWZlbHNlKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24gPT0gMiwgZGF0JGxuUlJfUzMqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkbG5SUl9TMykpICMgY3VycmVudGx5IE5Bc3doaWNoIGNhdXNlcyBlcnJvcgoKI2ZsaXBwaW5nIFNNRApkYXQkU01EX0VhIDwtIGlmZWxzZShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uID09IDIsIGRhdCRTTURfRSotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRTTURfRSkpICMgY3VycmVudGx5IE5Bc3doaWNoIGNhdXNlcyBlcnJvcgpkYXQkU01EX1NhICA8LSBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkU01EX1MqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkU01EX1MpKSAjIGN1cnJlbnRseSBOQXN3aGljaCBjYXVzZXMgZXJyb3IKZGF0JFNNRF9FU2EgPC0gIGlmZWxzZShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uID09IDIsIGRhdCRTTURfRVMqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkU01EX0VTKSkKCiMgYXNzaWduaW5nIGh1bWFuIHJlYWRhYmxlIHRlcm1zCmRhdCA8LSBkYXQgJT4lIG11dGF0ZShUeXBlX2Fzc2F5ID0gY2FzZV93aGVuKFR5cGVfYXNzYXkgPT0gMSB+ICJIYWJpdHVhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfYXNzYXkgPT0gMiB+ICJDb25kaXRpb25pbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX2Fzc2F5ID09IDMgfiAiUmVjb2duaXRpb24iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9hc3NheSA9PSA0IH4gIlVuY2xlYXIiKSwKICAgICAgICAgICAgICAgICAgICAgIExlYXJuaW5nX3ZzX21lbW9yeSA9IGNhc2Vfd2hlbihMZWFybmluZ192c19tZW1vcnkgPT0gMSB+ICJMZWFybmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhcm5pbmdfdnNfbWVtb3J5ID09IDIgfiAiTWVtb3J5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhcm5pbmdfdnNfbWVtb3J5ID09IDMgfiAiSGFiaXR1YXRpb24iKSwKICAgICAgICAgICAgICAgICAgICAgIFR5cGVfcmVpbmZvcmNlbWVudCA9IGNhc2Vfd2hlbihUeXBlX3JlaW5mb3JjZW1lbnQ9PSAxIH4iQXBwZXRpdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfcmVpbmZvcmNlbWVudD09IDIgfiAiQXZlcnNpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3JlaW5mb3JjZW1lbnQ9PSAzIH4gIk5vdCBhcHBsaWNhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9yZWluZm9yY2VtZW50PT0gNCB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9IGNhc2Vfd2hlbihUeXBlX3N0cmVzc19leHBvc3VyZSA9PSAxIH4gIkRlbnNpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gMiB+ICJTY2VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9PSAzIH4gIlNob2NrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlID09IDQgfiAiRXhlcnRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gNSB+ICJSZXN0cmFpbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gNiB+ICJNUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9PSA3IH4gIkNpcmNhZGlhbiByaHl0aG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gOCB+ICJOb2lzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9PSA5IH4gIk90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlID09IDEwIH4gIkNvbWJpbmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlID09IDExIH4gInVuY2xlYXIiKSwgCiAgICAgICAgICAgICAgICAgICAgICBBZ2Vfc3RyZXNzX2V4cG9zdXJlID0gY2FzZV93aGVuKEFnZV9zdHJlc3NfZXhwb3N1cmUgPT0gMSB+ICJQcmVuYXRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9zdHJlc3NfZXhwb3N1cmUgPT0gMiB+ICJFYXJseSBwb3N0bmF0YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2Vfc3RyZXNzX2V4cG9zdXJlID09IDMgfiAiQWRvbGVzY2VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9zdHJlc3NfZXhwb3N1cmUgPT0gNCB+ICJBZHVsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9zdHJlc3NfZXhwb3N1cmUgPT0gNSB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBTdHJlc3NfZHVyYXRpb24gPSBjYXNlX3doZW4oU3RyZXNzX2R1cmF0aW9uID09IDEgfiAiQWN1dGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVzc19kdXJhdGlvbiA9PSAyIH4gIkNocm9uaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVzc19kdXJhdGlvbiA9PSAzIH4gIkludGVybWl0dGVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZXNzX2R1cmF0aW9uID09IDQgfiAiVW5jbGVhciIpLAogICAgICAgICAgICAgICAgICAgICAgRUVfc29jaWFsID0gY2FzZV93aGVuKEVFX3NvY2lhbCA9PSAxIH4gIlNvY2lhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUVfc29jaWFsPT0gMiB+ICJOb24tc29jaWFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUVfc29jaWFsID09IDMgfiAiVW5jbGVhciIpLCAKICAgICAgICAgICAgICAgICAgICAgIEVFX2V4ZXJjaXNlID0gY2FzZV93aGVuKEVFX2V4ZXJjaXNlID09IDEgfiAiRXhlcmNpc2UiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFX2V4ZXJjaXNlID09IDIgfiAiTm8gZXhlcmNpc2UiKSwKICAgICAgICAgICAgICAgICAgICAgIEFnZV9FRV9leHBvc3VyZSA9IGNhc2Vfd2hlbihBZ2VfRUVfZXhwb3N1cmUgPT0gMSB+ICJQcmVuYXRhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9FRV9leHBvc3VyZSA9PSAyIH4gIkVhcmx5IHBvc3RuYXRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlX0VFX2V4cG9zdXJlID09IDMgfiAiQWRvbGVzY2VudCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9FRV9leHBvc3VyZSA9PSA0IH4gIkFkdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2VfRUVfZXhwb3N1cmUgPT0gNSB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBFeHBvc3VyZV9vcmRlciA9IGNhc2Vfd2hlbihFeHBvc3VyZV9vcmRlciA9PSAxIH4gIlN0cmVzcyBmaXJzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9zdXJlX29yZGVyID09IDIgfiAiRW5yaWNobWVudCBmaXJzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9zdXJlX29yZGVyID09IDMgfiAiQ29uY3VycmVudGx5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9zdXJlX29yZGVyID09IDQgfiAiVW5jbGVhciIpLAogICAgICAgICAgICAgICAgICAgICAgQWdlX2Fzc2F5ID0gY2FzZV93aGVuKEFnZV9hc3NheSA9PSAxIH4gIkVhcmx5IHBvc3RuYXRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlX2Fzc2F5ID09IDIgfiAiQWRvbGVzY2VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlX2Fzc2F5ID09IDMgfiAiQWR1bHQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2VfYXNzYXkgPT0gNCB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBTZXggPSBjYXNlX3doZW4oU2V4ID09IDEgfiAiRmVtYWxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V4ID09IDIgfiAiTWFsZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNleCA9PSAzIH4gIk1peGVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V4ID09IDQgfiAiVW5jbGVhciIpLAogICAgICAgICAgICAgICAgICAgICAgVHlwZV9FRV9leHBvc3VyZSA9IGNhc2Vfd2hlbihUeXBlX0VFX2V4cG9zdXJlID09IDEgfiAiTmVzdGluZyBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfRUVfZXhwb3N1cmUgPT0gMiB+ICJPYmplY3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9FRV9leHBvc3VyZSA9PSAzIH4gIkNhZ2UgY29tcGxleGl0eSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX0VFX2V4cG9zdXJlID09IDQgfiAiV2hlZWwvdHJhZGVtaWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9FRV9leHBvc3VyZSA9PSA1IH4gIkNvbWJpbmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9FRV9leHBvc3VyZSA9PSA2IH4gIk90aGVyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfRUVfZXhwb3N1cmUgPT0gNyB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBST0JfYmxpbmRpbmcgPSBjYXNlX3doZW4oUk9CX2JsaW5kaW5nID09IDEgfiAiWWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST0JfYmxpbmRpbmcgPT0gMiB+ICJObyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9CX2JsaW5kaW5nID09IDMgfiAiVW5jbGVhciIpLAogICAgICAgICAgICAgICAgICAgICAgUk9CX3JhbmRvbWlzYXRpb24gPSBjYXNlX3doZW4oUk9CX3JhbmRvbWlzYXRpb24gPT0gMSB+ICJZZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9CX3JhbmRvbWlzYXRpb24gPT0gMiB+ICJObyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST0JfcmFuZG9taXNhdGlvbiA9PSAzIH4gIlVuY2xlYXIiKSkKCiNtYWtpbmcgdmFyaWFuY2UgVkNWcwpWQ1ZfRSA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQkbG5SUlZfRSwgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKVkNWX1MgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JGxuUlJWX1MsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpClZDVl9FUyA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQkbG5SUlZfRVMsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpCgpWQ1ZfRWEgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JFNNRFZfRSwgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKVkNWX1NhIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdCRTTURWX1MsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpClZDVl9FU2EgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JFNNRFZfRVMsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpCgojd3JpdGUuY3N2KGRhdCwgZmlsZSA9IGhlcmUoIkRhdGEiLCAnRGF0YV9wcm9jZXNzZWQuY3N2JyksIHJvdy5uYW1lcyA9IFRSVUUpCmBgYAoKIyBEYXRhIGV4cGxvcmF0aW9uCgojIyBHZW5lcmFsCk51bWJlciBvZiBlZmZlY3Qgc2l6ZXMKYGBgIHtyfQojTnVtYmVyIG9mIGVmZmVjdCBzaXplcwpsZW5ndGgodW5pcXVlKGRhdCRFU19JRCkpICAKYGBgCgpOdW1iZXIgb2Ygc3R1ZGllcwpgYGAge3J9Cmxlbmd0aCh1bmlxdWUoZGF0JFN0dWR5X0lEKSkKYGBgCgpQdWJsaWNhdGlvbiB5ZWFyIHJhbmdlCmBgYCB7cn0KbWluKGRhdCRZZWFyX3B1Ymxpc2hlZCkgCm1heChkYXQkWWVhcl9wdWJsaXNoZWQpCmBgYAoKIyMgVmlzdWFsIG9mIG1pc3NpbmcgZGF0YQoKYGBge3IsIHJlc3VsdHMgPSAnaGlkZSd9CgpwbG90X21pc3NpbmcgPC0gdmlzX21pc3MoZGF0KSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgdmp1c3QgPSAzKSwKICAgICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbih0ID0gMC41LCByID0gMywgYiA9IDEsIGwgPSAxLCB1bml0ID0gImNtIikpICsKICBnZ3RpdGxlKCJNaXNzaW5nIGRhdGEgaW4gdGhlIHNlbGVjdGVkIHByZWRpY3RvcnMiKSAjbm8gbWlzc2luZyB2YWx1ZXMKCnBsb3RfbWlzc2luZwojdXNlR29vZG1hbiBhbmQgS3J1c2thbOKAmXMgz4QgbWVhc3VyZSBvZiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGNhdGVnb3JpY2FsIHByZWRpY3RvciB2YXJpYWJsZXMgKGZ1bmN0aW9uIGZyb20gcGFja2FnZSBHb29kbWFuS3J1c2thbDogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL0dvb2RtYW5LcnVza2FsL3ZpZ25ldHRlcy9Hb29kbWFuS3J1c2thbC5odG1sKQojR0ttYXRyaXggPC0gR0t0YXVEYXRhZnJhbWUoc3Vic2V0KGRhdCwgc2VsZWN0ID0gYygiU2V4IiwgIlR5cGVfYXNzYXkiLCAiTGVhcm5pbmdfdnNfbWVtb3J5IiwgIyJUeXBlX3JlaW5mb3JjZW1lbnQiLCAgIlR5cGVfc3RyZXNzX2V4cG9zdXJlIiwgIkFnZV9zdHJlc3NfZXhwb3N1cmUiLCAiU3RyZXNzX2R1cmF0aW9uIiwgIyJFRV9zb2NpYWxfSFIiLCAiRUVfZXhlcmNpc2UiLCAiQWdlX0VFX2V4cG9zdXJlIiwgIkV4cG9zdXJlX29yZGVyIiwgIkFnZV9hc3NheSIpKSkKI3Bsb3QoR0ttYXRyaXgpCgojc2ltcGxlIHBhaXJ3aXNlIGNvbnRpbmdlbmN5IHRhYmxlcwojIHRhYmxlKGRhdCRUeXBlX2Fzc2F5LCBkYXQkVHlwZV9yZWluZm9yY2VtZW50KSAKIyB0YWJsZShkYXQkQWdlX3N0cmVzc19leHBvc3VyZSwgZGF0JEFnZV9FRV9leHBvc3VyZSkgCiMgdGFibGUoZGF0JFR5cGVfc3RyZXNzX2V4cG9zdXJlLCBkYXQkQWdlX3N0cmVzc19leHBvc3VyZSkKIyB0YWJsZShkYXQkVHlwZV9zdHJlc3NfZXhwb3N1cmUsIGRhdCRBZ2VfYXNzYXkpCiMgdGFibGUoZGF0JFR5cGVfc3RyZXNzX2V4cG9zdXJlLCBkYXQkU3RyZXNzX2R1cmF0aW9uKQpgYGAKVmlzdWFsIG9mIG1pc3NpbmcgZGF0YSBmb3IgZWFjaCBjb2x1bW4uIE5vdGUgdGhhdCBtb3N0IG1pc3NpbmcgZGF0YSBhcmUgZm9yIGRpZmZlcmVudCBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGFzIHBhcGVycyBhcmUgb2Z0ZW4gcmVwb3J0IHJlc3VsdHMgdXNpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgKGkuZS4sIFNELCBTRSwgbWVhbiwgbWVkaWFuIGV0YykuCipDYW5ub3QgcmVkdWNlIHRleHQgc2l6ZSBpbiB0aGlzIGZpZ3VyZSoKCiMjIEFsbHV2aWFsIGRpYWdyYW1zIHsudGFic2V0fQpTaG93cyB0aGUgcmVsYXRpb25zaGlwL25lc3RlZG5lc3Mgb2YgZGlmZmVyZW50IGRhdGEgZWxlbWVudHMgKHVzZWQgdG8gcHJvZHVjZSBGaWcuIDIpCgojIyMgU3ViamVjdHMgaW5mbzogc3BlY2llcy1zdHJhaW4tc2V4CgpgYGB7ciwgcmVzdWx0cz0gJ2hpZGUnLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KZnJlcV9BIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGF0JFNleCwgZGF0JENvbW1vbl9zcGVjaWVzLCBkYXQkU3RyYWluKSkgJT4lIHJlbmFtZShTZXggPSBWYXIxLCBTcGVjaWVzID0gVmFyMiwgU3RyYWluID0gVmFyMykgI21ha2UgYSBkYXRhIGZyYW1lIG9mIGZyZXF1ZW5jaWVzIGZvciB0aHJlZSBzZWxlY3RlZCB2YXJpYWJsZXMKaXNfYWxsdXZpYV9mb3JtKGFzLmRhdGEuZnJhbWUoZnJlcV9BKSwgYXhlcyA9IDE6Mywgc2lsZW50ID0gVFJVRSkKCnAxIDwtIGdncGxvdChkYXRhID0gZnJlcV9BLAogIGFlcyhheGlzMSA9IFNleCwgYXhpczIgPSBTcGVjaWVzLCBheGlzMyA9IFN0cmFpbiwgeSA9IEZyZXEpKSArCiAgZ2VvbV9hbGx1dml1bShhZXMoZmlsbCA9IFNleCkpICsKICBnZW9tX2Zsb3coKSArCiAgZ2VvbV9zdHJhdHVtKGFlcyhmaWxsID0gU2V4KSkgKwogIGdlb21fdGV4dChzdGF0ID0gInN0cmF0dW0iLCBhZXMobGFiZWwgPSBhZnRlcl9zdGF0KHN0cmF0dW0pKSkgKwogICN0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lX3ZvaWQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCB2anVzdCA9IDMpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dCgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLCAxLCAwLCAxKSwgImNtIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIlNleCIsICJTcGVjaWVzIiwgIlN0cmFpbiIpLCBleHBhbmQgPSBjKDAuMTUsIDAuMDUpLCBwb3NpdGlvbiA9ICJ0b3AiKSArCiAgZ2d0aXRsZSgiQSAgc3R1ZHkgc3ViamVjdHMiKQoKcDEKYGBgCioqRmlnLiAyYSoqIFJlbGF0aW9uc2hpcC9uZXN0ZWRuZXNzIGJldHdlZW4gc3R1ZHkgc3BlY2llcywgc3RyYWluIG9mIHJvZGVudCwgYW5kIHNleAoKIyMjIEVudmlyb25tZW50YWwgZW5yaWNobWVudCBpbmZvOiBhZ2UtZXhlcmNpc2Utc29jaWFsIEVFCgpgYGB7ciwgcmVzdWx0cyA9ICdoaWRlJywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CgpmcmVxX0IgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXQkQWdlX0VFX2V4cG9zdXJlLCBkYXQkRUVfZXhlcmNpc2UsIGRhdCRFRV9zb2NpYWwpKSAlPiUgcmVuYW1lKEFnZV9FRV9leHBvc3VyZSA9IFZhcjEsIEVFX2V4ZXJjaXNlID0gVmFyMiwgRUVfc29jaWFsID0gVmFyMykgI21ha2UgYSBkYXRhIGZyYW1lIG9mIGZyZXF1ZW5jaWVzIGZvciB0aHJlZSBzZWxlY3RlZCB2YXJpYWJsZXMKaXNfYWxsdXZpYV9mb3JtKGFzLmRhdGEuZnJhbWUoZnJlcV9CKSwgYXhlcyA9IDE6Mywgc2lsZW50ID0gVFJVRSkKCnAyIDwtIGdncGxvdChkYXRhID0gZnJlcV9CLAogIGFlcyhheGlzMSA9IEFnZV9FRV9leHBvc3VyZSwgYXhpczIgPSBFRV9leGVyY2lzZSwgYXhpczMgPSBFRV9zb2NpYWwsIHkgPSBGcmVxKSkgKwogIGdlb21fYWxsdXZpdW0oYWVzKGZpbGwgPSBBZ2VfRUVfZXhwb3N1cmUpKSArCiAgZ2VvbV9mbG93KCkgKwogIGdlb21fc3RyYXR1bShhZXMoZmlsbCA9IEFnZV9FRV9leHBvc3VyZSkpICsKICBnZW9tX3RleHQoc3RhdCA9ICJzdHJhdHVtIiwgYWVzKGxhYmVsID0gYWZ0ZXJfc3RhdChzdHJhdHVtKSkpICsKICAjdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZV92b2lkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgdmp1c3QgPSAzKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwgMSwgMCwgMSksICJjbSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJBZ2UiLCAiRXhlcmNpc2UiLCAiU29jaWFsIiksIGV4cGFuZCA9IGMoMC4xLCAwLjEpLCBwb3NpdGlvbiA9ICJ0b3AiKSArCiAgZ2d0aXRsZSgiQiAgZW52aXJvbm1lbnRhbCBlbnJpY2htZW50IikKCnAyCmBgYAoqKkZpZy4gMmIqKiBSZWxhdGlvbnNoaXAvbmVzdGVkbmVzcyBiZXR3ZWVuIHRoZSBhZ2Ugb2YgZW5yaWNobWVudCBleHBvc3VyZSwgaWYgZW5yaWNobWVudCBpbnZvbHZlZCBhIG1hbmlwdWxhdGlvbiBvZiBleGVyY2lzZSBhbmQgc29jaWFsIGVudmlyb25tZW50CgojIyMgU3RyZXNzIGluZm86IGFnZS1kdXJhdGlvbi10eXBlIHN0cmVzcwoKYGBge3IsIHJlc3VsdHMgPSAnaGlkZScsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpmcmVxX0MgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXQkQWdlX3N0cmVzc19leHBvc3VyZSwgZGF0JFN0cmVzc19kdXJhdGlvbiwgZGF0JFR5cGVfc3RyZXNzX2V4cG9zdXJlKSkgJT4lIHJlbmFtZShBZ2Vfc3RyZXNzID0gVmFyMSwgRHVyYXRpb25fc3RyZXNzID0gVmFyMiwgVHlwZV9zdHJlc3MgPSBWYXIzKSAjbWFrZSBhIGRhdGEgZnJhbWUgb2YgZnJlcXVlbmNpZXMgZm9yIHRocmVlIHNlbGVjdGVkIHZhcmlhYmxlcwppc19hbGx1dmlhX2Zvcm0oYXMuZGF0YS5mcmFtZShmcmVxX0MpLCBheGVzID0gMTozLCBzaWxlbnQgPSBUUlVFKQoKcDMgPC0gZ2dwbG90KGRhdGEgPSBmcmVxX0MsCiAgYWVzKGF4aXMxID0gQWdlX3N0cmVzcywgYXhpczIgPSBEdXJhdGlvbl9zdHJlc3MsIGF4aXMzID0gVHlwZV9zdHJlc3MsIHkgPSBGcmVxKSkgKwogIGdlb21fYWxsdXZpdW0oYWVzKGZpbGwgPSBBZ2Vfc3RyZXNzKSkgKwogIGdlb21fZmxvdygpICsKICBnZW9tX3N0cmF0dW0oYWVzKGZpbGwgPSBBZ2Vfc3RyZXNzKSkgKwogIGdlb21fdGV4dChzdGF0ID0gInN0cmF0dW0iLCBhZXMobGFiZWwgPSBhZnRlcl9zdGF0KHN0cmF0dW0pKSkgKwogICN0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lX3ZvaWQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCB2anVzdCA9IDMpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dCgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLCAxLCAwLCAxKSwgImNtIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIkFnZSIsICJEdXJhdGlvbiIsICJUeXBlIiksIGV4cGFuZCA9IGMoMC4xLCAwLjEpLCBwb3NpdGlvbiA9ICJ0b3AiKSArCiAgZ2d0aXRsZSgiQyAgc3RyZXNzIGV4cG9zdXJlIikKCnAzCmBgYAoqKkZpZy4gMmMqKiBSZWxhdGlvbnNoaXAvbmVzdGVkZXNzIGJldHdlZW4gdGhlIGFnZSBvZiBzdHJlc3MgZXhwb3N1cmUsIHRoZSBkdXJhdGlvbiBvZiB0aGUgc3RyZXMsIGFuZCB0aGUgdHlwZSBvZiBzdHJlc3MKCiMjIyBBc3NheSBpbmZvOiBMdnNNLXR5cGUtcmVpbmZvcmNlbWVudAoKYGBge3IsIHJlc3VsdHMgPSAnaGlkZScsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpmcmVxX0QgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXQkTGVhcm5pbmdfdnNfbWVtb3J5LCBkYXQkVHlwZV9hc3NheSwgZGF0JFR5cGVfcmVpbmZvcmNlbWVudCkpICU+JSByZW5hbWUoTGVhcm5pbmdfTWVtb3J5ID0gVmFyMSwgVHlwZSA9IFZhcjIsIFJlaW5mb3JjZW1lbnQgPSBWYXIzKSAjbWFrZSBhIGRhdGEgZnJhbWUgb2YgZnJlcXVlbmNpZXMgZm9yIHRocmVlIHNlbGVjdGVkIHZhcmlhYmxlcwppc19hbGx1dmlhX2Zvcm0oYXMuZGF0YS5mcmFtZShmcmVxX0QpLCBheGVzID0gMTozLCBzaWxlbnQgPSBUUlVFKQoKcDQgPC0gZ2dwbG90KGRhdGEgPSBmcmVxX0QsCiAgYWVzKGF4aXMxID0gTGVhcm5pbmdfTWVtb3J5LCBheGlzMiA9IFR5cGUsIGF4aXMzID0gUmVpbmZvcmNlbWVudCwgeSA9IEZyZXEpKSArCiAgZ2VvbV9hbGx1dml1bShhZXMoZmlsbCA9IExlYXJuaW5nX01lbW9yeSkpICsKICBnZW9tX2Zsb3coKSArCiAgZ2VvbV9zdHJhdHVtKGFlcyhmaWxsID0gTGVhcm5pbmdfTWVtb3J5KSkgKwogIGdlb21fdGV4dChzdGF0ID0gInN0cmF0dW0iLCBhZXMobGFiZWwgPSBhZnRlcl9zdGF0KHN0cmF0dW0pKSkgKwogICN0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lX3ZvaWQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCB2anVzdCA9IDMpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dCgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLCAxLCAwLCAxKSwgImNtIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIkxlYXJuaW5nX01lbW9yeSIsICJUeXBlIiwgIlJlaW5mb3JjZW1lbnQiKSwgZXhwYW5kID0gYygwLjEsIDAuMSksIHBvc2l0aW9uID0gInRvcCIpICsKICBnZ3RpdGxlKCJEICBjb2duaXRpdmUgYXNzYXkiKQoKcDQKYGBgCioqRmlnLiAyZCoqIFJlbGF0aW9uc2hpcC9uZXN0ZWRuZXNzIGJldHdlZW4gaWYgdGhlIGFzc2F5IG1lYXN1cmVkIGEgbGVhcm5pbmcgb3IgbWVtb3J5IHRyYWl0LCB0aGUgdHlwZSBvZiBhc3NheSB1c2VkLCBhbmQgdGhlIHR5cGUgb2YgcmVpbmZvcmNlbWVudCB1c2VkCgojIyMgQ29tYmluZWQgcGxvdAoKYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQojcDEgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSAjUGFzdGVsMQoKKHAxICsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikpIC8gKHAyICsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikpIC8gKHAzICsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikpIC8gKHA0ICsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikpICsgcGxvdF9sYXlvdXQobmNvbCA9IDEsIGhlaWdodHMgPSBjKDEsMSwxLDEsMSkpCgojZ2dzYXZlKGZpbGUgPSAiLi9maWdzL0FsbHV2aWFsX2RpYWdyYW1zX3YyLnBkZiIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEyLCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCwgc2NhbGUgPSAyKSAjLCBkZXZpY2UgPSBjYWlyb19wZGYpCmBgYAoqKkZpZy4gMioqIFRoZSBjb21iaW5lZCBwbG90IG9mIGFsbCBhbGx1dmlhbCBkaWFncmFtcyB1c2VkIHRvIG1ha2UgRmlnLiAyIGluIHRoZSBtYWluIHRleHQKCiMjIFJpc2sgb2YgQmlhcwpQZXJjZW50IG9mIHN0dWRpZXMgdGhhdCB1c2VkIHJhbmRvbWlzYXRpb24KYGBgIHtyfQpkYXQgJT4lIGdyb3VwX2J5KFJPQl9yYW5kb21pc2F0aW9uKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuX2Rpc3RpbmN0KFN0dWR5X0lEKSkKCjE1LzMwCmBgYAoKUGVyY2VudCBvZiBzdHVkaWVzIHRoYXQgdXNlZCBibGluZGluZwpgYGAge3J9CiNibGluZGluZwpkYXQgJT4lIGdyb3VwX2J5KFJPQl9ibGluZGluZykgJT4lIAogIHN1bW1hcmlzZShuID0gbl9kaXN0aW5jdChTdHVkeV9JRCkpCgo2LzMwCmBgYAoKIyBNb2RlbGxpbmcgd2l0aCBsblJSCgojIyBNYWluIGVmZmVjdDogZW52aXJvbm1lbnRhbCBlbnJpY2htZW50CgojIyMgTWV0YS1hbmFseXNpcwoKYGBgIHtyfQojZGF0IDwtIHJlYWRfY3N2KGhlcmUoIkRhdGEiLCJEYXRhX3Byb2Nlc3NlZC5jc3YiKSkKCm1vZF9FMCA8LSBybWEubXYoeWkgPSBsblJSX0VhLCBWID0gVkNWX0UsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQpzdW1tYXJ5KG1vZF9FMCkgCmkyX21sKG1vZF9FMCkgCgpvcmNoYXJkX3Bsb3QobW9kX0UwLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArICAjIE9yY2hhcmQgcGxvdCAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSsgIyBjb25maWRlbmNlIGludGVydmFscwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSAiZGFya29yYW5nZSIpKyAjIGNoYW5nZSBjb2xvdXJzCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPSJkYXJrb3JhbmdlIikrIAogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkgCgpgYGAKKipGaWcuIDMqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyBtZXRhLWFuYWx5dGljIG1lYW4gYW5kIDk1JSBjb25maWRlbmNlIGludGVydmFsICh0aGluayBibGFjayBsaW5lKSBhbmQgOTUlIHByZWRpY3Rpb24gaW50ZXJ2YWwgKHRoaW4gYmxhY2sgbGluZSkuIEluZGl2aWR1YWxzIHBvaW50cyBzaG93IG9ic2VydmVkIGVmZmVjdCBzaXplcyBhbmQgc2FtcGxlIHNpemVzLiAgIAoKIyMjIE1ldGEtcmVncmVzc2lvbjogdW5pLW1vZGVyYXRvciB7LnRhYnNldH0KCiMjIyMgTGVhcm5pbmcgdnMgTWVtb3J5CldhcyB0aGUgcmVzcG9uc2UgbGVhcm5pbmcgb3IgbWVtb3J5PwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KbW9kX0UxIDwtICBybWEubXYoeWkgPSBsblJSX0VhLCBWID0gVkNWX0UsIG1vZCA9IH5MZWFybmluZ192c19tZW1vcnktMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX0UxKSAKcjJfbWwobW9kX0UxKSAKCkx2c01fRTwtIG9yY2hhcmRfcGxvdChtb2RfRTEsIG1vZCA9ICJMZWFybmluZ192c19tZW1vcnkiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHhsaW0oLTAuNSwgMikgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkzNCIsImdyZXkzNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdyZXkzNCIsImdyZXkzNCIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpICsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkgKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpMdnNNX0UKYGBgCioqRmlnLiA0YSoqIE9yY2hhcmQgcGxvdCBzaG93aW5nIHRoZSBncm91cC13aXNlIG1lYW5zIG9mIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAnTGVhcm5pbmdfdnNfbWVtb3J5JyB3aXRoIHRoZWlyIDk1JSBjb25maWRlbmNlIGludGVydmFsICh0aGluayBibGFjayBsaW5lKSBhbmQgOTUlIHByZWRpY3Rpb24gaW50ZXJ2YWwgKHRoaW4gYmxhY2sgbGluZSkuIEluZGl2aWR1YWxzIHBvaW50cyBzaG93IG9ic2VydmVkIGVmZmVjdCBzaXplcyBhbmQgc2FtcGxlIHNpemVzLiAgIAoKIyMjIyMgUGFpcndpc2UgY29tcGFyaXNvbiAKYGBgIHtyfQpjb250cmFfbW9kX0UxIDwtIGNvbnRyYXN0X2Z1bihkYXRhID0gZGF0LCByZXNwb25zZSA9IGxuUlJfRWEsIG1vZGVyYXRvciA9IExlYXJuaW5nX3ZzX21lbW9yeSwgVkNWID0gVkNWX0UpCnJlc190YWJsZV9tb2RfRTEgPC0gZ2V0X2VzdGltYXRlKG1vZGVsID0gbW9kX0UxLCBjb250cmEgPSBjb250cmFfbW9kX0UxLCBtb2RlcmF0b3IgPSBUeXBlX2Fzc2F5KQoKcmVzX3RhYmxlX21vZF9FMQpgYGAKCiMjIyMgVHlwZSBvZiBhc3NheQpUaGUgYnJvYWQgY2F0ZWdvcnkgb2YgdGhlIHR5cGUgb2YgYXNzYXkgdXNlZCB0byBtZWFzdXJlIGxlYXJuaW5nIG9yIG1lbW9yeSAKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmRhdDEgPC0gZmlsdGVyKGRhdCwgVHlwZV9hc3NheSAlaW4lIGMoIlJlY29nbml0aW9uIiwgIkhhYml0dWF0aW9uIiwgIkNvbmRpdGlvbmluZyIpKQpWQ1ZfRTEgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0MSRsblJSVl9FLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX0UyIDwtIHJtYS5tdih5aSA9IGxuUlJfRWEsIFYgPSBWQ1ZfRTEsIG1vZCA9IH5UeXBlX2Fzc2F5LTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0MSkKCnN1bW1hcnkobW9kX0UyKQpyMl9tbChtb2RfRTIpIAoKTGVhcm5pbmdfRSA8LSBvcmNoYXJkX3Bsb3QobW9kX0UyLCBtb2QgPSAiVHlwZV9hc3NheSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgeGxpbSgtMC41LCAyKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IiwgImdyZXkzNCIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpIAoKTGVhcm5pbmdfRQpgYGAKKipGaWcuIDRiKiogT3JjaGFyZCBwbG90IHNob3dpbmcgdGhlIGdyb3VwLXdpc2UgbWVhbnMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlICdUeXBlX2Fzc2F5JyB3aXRoIHRoZWlyIDk1JSBjb25maWRlbmNlIGludGVydmFsICh0aGluayBibGFjayBsaW5lKSBhbmQgOTUlIHByZWRpY3Rpb24gaW50ZXJ2YWwgKHRoaW4gYmxhY2sgbGluZSkuIEluZGl2aWR1YWxzIHBvaW50cyBzaG93IG9ic2VydmVkIGVmZmVjdCBzaXplcyBhbmQgc2FtcGxlIHNpemVzLiAgIAoKIyMjIyMgUGFpcndpc2UgY29tcGFyaXNvbnMKCmBgYCB7cn0KY29udHJhX21vZF9FMiA8LSBjb250cmFzdF9mdW4oZGF0YSA9IGRhdDEsIHJlc3BvbnNlID0gbG5SUl9FYSwgbW9kZXJhdG9yID0gVHlwZV9hc3NheSwgVkNWID0gVkNWX0UxKQpyZXNfdGFibGVfbW9kX0UyIDwtIGdldF9lc3RpbWF0ZShtb2RlbCA9IG1vZF9FMiwgY29udHJhID0gY29udHJhX21vZF9FMiwgbW9kZXJhdG9yID0gVHlwZV9hc3NheSkKCnJlc190YWJsZV9tb2RfRTIKYGBgCiAKIyMjIyBUeXBlIG9mIHJlaW5mb3JjZW1lbnQgCklmIGNvbmRpdGlvbmluZyB3YXMgdXNlZCwgd2FzIGF2ZXJzaXZlIG9yIGFwcGV0aXRpdmUgcmVpbmZvcmNlbWVudCB1c2VkPwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KCmRhdDIgPC0gZmlsdGVyKGRhdCwgVHlwZV9yZWluZm9yY2VtZW50ICVpbiUgYygiQXBwZXRpdGl2ZSIsICJBdmVyc2l2ZSIsICJOb3QgYXBwbGljYWJsZSIpKQpWQ1ZfRTIgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0MiRsblJSVl9FLCBjbHVzdGVyID0gZGF0MiRTdHVkeV9JRCwgciA9IDAuNSkKbW9kX0UzIDwtIHJtYS5tdih5aSA9IGxuUlJfRWEsIFYgPSBWQ1ZfRTIsIG1vZCA9IH4gVHlwZV9yZWluZm9yY2VtZW50LTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQyKQoKc3VtbWFyeShtb2RfRTMpCnIyX21sKG1vZF9FMykgCgpSZWluZm9yY2VtZW50X0UgPC1vcmNoYXJkX3Bsb3QobW9kX0UzLCBtb2QgPSAiVHlwZV9yZWluZm9yY2VtZW50IiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICB4bGltKC0wLjUsIDIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiLCJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiLCAiZ3JleTM0IikpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpSZWluZm9yY2VtZW50X0UKYGBgYAoqKkZpZy4gNGMqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ1R5cGVfcmVpbmZvcmNlbWVudCcgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMjIFBhaXJ3aXNlIGNvbXBhcmlzb25zCgpgYGAge3J9CmNvbnRyYV9tb2RfRTMgPC0gY29udHJhc3RfZnVuKGRhdGEgPSBkYXQyLCByZXNwb25zZSA9IGxuUlJfRWEsIG1vZGVyYXRvciA9IFR5cGVfcmVpbmZvcmNlbWVudCwgVkNWID0gVkNWX0UyKQpyZXNfdGFibGVfbW9kX0UzIDwtIGdldF9lc3RpbWF0ZShtb2RlbCA9IG1vZF9FMywgY29udHJhID0gY29udHJhX21vZF9FMywgbW9kZXJhdG9yID0gVHlwZV9yZWluZm9yY2VtZW50KQoKcmVzX3RhYmxlX21vZF9FMwpgYGAKCiMjIyMgQWdlIG9mIGVucmljaG1lbnQKVGhlIGFnZSB3aGVuIGluZGl2aWR1YWxzIHdlcmUgZXhwb3NlZCB0byBlbnZpcm9ubWVudGFsIGVucmljaG1lbnQKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmRhdDMgPC0gZmlsdGVyKGRhdCwgQWdlX0VFX2V4cG9zdXJlICVpbiUgYygiQWR1bHQiLCAiQWRvbGVzY2VudCIpKQpWQ1ZfRTMgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0MyRsblJSVl9FLCBjbHVzdGVyID0gZGF0MyRTdHVkeV9JRCwgciA9IDAuNSkKCgptb2RfRTQgPC0gcm1hLm12KHlpID0gbG5SUl9FYSwgViA9IFZDVl9FMywgbW9kID0gfkFnZV9FRV9leHBvc3VyZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQzKQoKc3VtbWFyeShtb2RfRTQpIApyMl9tbChtb2RfRTQpIAoKQWdlX0U8LSBvcmNoYXJkX3Bsb3QobW9kX0U0LCBtb2QgPSAiQWdlX0VFX2V4cG9zdXJlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICB4bGltKC0wLjUsIDIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAgCgpBZ2VfRQpgYGAKKipGaWcuIDRkKiogT3JjaGFyZCBwbG90IHNob3dpbmcgdGhlIGdyb3VwLXdpc2UgbWVhbnMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlICdBZ2VfRUVfZXhwb3N1cmUnIHdpdGggdGhlaXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKHRoaW5rIGJsYWNrIGxpbmUpIGFuZCA5NSUgcHJlZGljdGlvbiBpbnRlcnZhbCAodGhpbiBibGFjayBsaW5lKS4gSW5kaXZpZHVhbHMgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgZWZmZWN0IHNpemVzIGFuZCBzYW1wbGUgc2l6ZXMuCgojIyMjIyBQYWlyd2lzZSBjb21wYXJpc29ucwoKYGBgIHtyfQpjb250cmFfbW9kX0U0IDwtIGNvbnRyYXN0X2Z1bihkYXRhID0gZGF0MywgcmVzcG9uc2UgPSBsblJSX0VhLCBtb2RlcmF0b3IgPSBBZ2VfRUVfZXhwb3N1cmUsIFZDViA9IFZDVl9FMykKcmVzX3RhYmxlX21vZF9FNCA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfRTQsIGNvbnRyYSA9IGNvbnRyYV9tb2RfRTQsIG1vZGVyYXRvciA9IEFnZV9FRV9leHBvc3VyZSkKCnJlc190YWJsZV9tb2RfRTQKYGBgCgoKIyMjIyBFeGVyY2lzZSBlbnJpY2htZW50CkRpZCBlbnJpY2htZW50IGludm9sdmUgdGhlIGFkZGl0aW9uIG9mIGFwcGFyYXR1cyBmb3Igdm9sdW50YXJ5IGV4ZXJjaXNlIChlLmcuLCBhIHdoZWVsIG9yIHRyZWFkbWlsbCk/CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQptb2RfRTU8LSBybWEubXYoeWkgPSBsblJSX0VhLCBWID0gVkNWX0UsIG1vZCA9IH5FRV9leGVyY2lzZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9FNSkKcjJfbWwobW9kX0U1KSAKIApFeGVyY2lzZV9FIDwtb3JjaGFyZF9wbG90KG1vZF9FNSwgbW9kID0gIkVFX2V4ZXJjaXNlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICB4bGltKC0wLjUsIDIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCkV4ZXJjaXNlX0UKYGBgCioqRmlnLiA0ZCoqIE9yY2hhcmQgcGxvdCBzaG93aW5nIHRoZSBncm91cC13aXNlIG1lYW5zIG9mIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAnRUVfZXhlcmNpc2UnIHdpdGggdGhlaXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKHRoaW5rIGJsYWNrIGxpbmUpIGFuZCA5NSUgcHJlZGljdGlvbiBpbnRlcnZhbCAodGhpbiBibGFjayBsaW5lKS4gSW5kaXZpZHVhbHMgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgZWZmZWN0IHNpemVzIGFuZCBzYW1wbGUgc2l6ZXMuCgojIyMjIyBQYWlyd2lzZSBjb21wYXJpc29ucwoKYGBgIHtyfQpjb250cmFfbW9kX0U1IDwtIGNvbnRyYXN0X2Z1bihkYXRhID0gZGF0LCByZXNwb25zZSA9IGxuUlJfRWEsIG1vZGVyYXRvciA9IEVFX2V4ZXJjaXNlLCBWQ1YgPSBWQ1ZfRSkKcmVzX3RhYmxlX21vZF9FNSA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfRTUsIGNvbnRyYSA9IGNvbnRyYV9tb2RfRTUsIG1vZGVyYXRvciA9IEVFX2V4ZXJjaXNlKQoKcmVzX3RhYmxlX21vZF9FNQpgYGAKCiMjIyMgU29jaWFsIGVucmljaG1lbnQKRGlkIGVucmljaG1lbnQgaW52b2x2ZSBtb3JlIGNvbnNwZWNpZmljcyAobm90ZSB0aGF0IHdlIGRpZCBub3QgaW5jbHVkZSBzdHVkaWVzIHRoYXQgb25seSBwcm92aWRlZCBzb2NpYWwgZW5yaWNobWVudCBidXQgbm8gb3RoZXIgZm9ybSBvZiBhYmlvdGljIGVucmljaG1lbnQpPwoKYGBgIHtyLCAgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmRhdDQgPC0gZmlsdGVyKGRhdCwgRUVfc29jaWFsICVpbiUgYygiU29jaWFsIiwgIk5vbi1zb2NpYWwiKSkKVkNWX0U0IDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDQkbG5SUlZfRSwgY2x1c3RlciA9IGRhdDQkU3R1ZHlfSUQsIHIgPSAwLjUpCiAgCm1vZF9FNjwtIHJtYS5tdih5aSA9IGxuUlJfRWEsIFYgPSBWQ1ZfRTQsIG1vZCA9IH5FRV9zb2NpYWwtMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsZGF0YSA9IGRhdDQpCgpzdW1tYXJ5KG1vZF9FNikKcjJfbWwobW9kX0U2KSAKClNvY2lhbF9FIDwtb3JjaGFyZF9wbG90KG1vZF9FNiwgbW9kID0gIkVFX3NvY2lhbCIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgeGxpbSgtMC41LCAyKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IikpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKClNvY2lhbF9FIApgYGAKKipGaWcuIDRlKiogT3JjaGFyZCBwbG90IHNob3dpbmcgdGhlIGdyb3VwLXdpc2UgbWVhbnMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlICdFRV9zb2NpYWwnIHdpdGggdGhlaXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKHRoaW5rIGJsYWNrIGxpbmUpIGFuZCA5NSUgcHJlZGljdGlvbiBpbnRlcnZhbCAodGhpbiBibGFjayBsaW5lKS4gSW5kaXZpZHVhbHMgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgZWZmZWN0IHNpemVzIGFuZCBzYW1wbGUgc2l6ZXMuCgojIyMjIyBQYWlyd2lzZSBjb21wYXJpc29ucwoKYGBgIHtyfQpjb250cmFfbW9kX0U2IDwtIGNvbnRyYXN0X2Z1bihkYXRhID0gZGF0NCwgcmVzcG9uc2UgPSBsblJSX0VhLCBtb2RlcmF0b3IgPSBFRV9zb2NpYWwsIFZDViA9IFZDVl9FNCkKcmVzX3RhYmxlX21vZF9FNiA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfRTUsIGNvbnRyYSA9IGNvbnRyYV9tb2RfRTYsIG1vZGVyYXRvciA9IEVFX3NvY2lhbCkKCnJlc190YWJsZV9tb2RfRTYKYGBgCgoKIyMjIFB1YmxpY2F0aW9uIGJpYXMgJiBzZW5zaXRpdml0eSBhbmFseXNpcyB7LnRhYnNldH0KCiMjIyMgIE11bHRpLW1vZGVyYXRvciBtb2RlbApgYGAge3IsIGV2YWwgPSBGQUxTRX0KIyBmaWx0ZXIgZGF0YSBzbyB0aGF0IGFsbCBLIDwgNSBhcmUgcmVtb3ZlZApkYXRfRWZtIDwtIGRhdCAlPiUKICBmaWx0ZXIoVHlwZV9hc3NheSAlaW4lIGMoIlJlY29nbml0aW9uIiwgIkhhYml0dWF0aW9uIiwgIkNvbmRpdGlvbmluZyIpLAogICAgICAgICBUeXBlX3JlaW5mb3JjZW1lbnQgJWluJSBjKCJBcHBldGl0aXZlIiwgIkF2ZXJzaXZlIiwgIk5vdCBhcHBsaWNhYmxlIiksCiAgICAgICAgIEVFX3NvY2lhbCAlaW4lIGMoIlNvY2lhbCIsICJOb24tc29jaWFsIiksIAogICAgICAgICBBZ2VfRUVfZXhwb3N1cmUgJWluJSBjKCJBZHVsdCIsICJBZG9sZXNjZW50IikpCgpWQ1ZfRWZtIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdF9FZm0kbG5SUlZfRSwgY2x1c3RlciA9IGRhdF9FZm0kU3R1ZHlfSUQsIHIgPSAwLjUpCiAgICAgICAgICAgICAgICAgCm1vZF9FZm0gPC0gcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9FZm0sIG1vZCA9IH5UeXBlX2Fzc2F5LTEgKyBMZWFybmluZ192c19tZW1vcnkgKyBUeXBlX3JlaW5mb3JjZW1lbnQgKyBFRV9zb2NpYWwgKyBFRV9leGVyY2lzZSArIEFnZV9FRV9leHBvc3VyZSAsIHJhbmRvbSA9ICAgbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0X0VmbSkKI3N1bW1hcnkobW9kX0VmbSkKI3IyX21sKG1vZF9FZm0pIAoKcmVzX0VmbSA8LSBkcmVkZ2UobW9kX0VmbSwgdHJhY2U9MikKc2F2ZVJEUyhyZXNfRWZtLCBmaWxlID0gaGVyZSgiUmRhdGEiLCAicmVzX0VmbS5yZHMiKSkKIyBhbHNvIHNhdmluZyB0aGUgZnVsbCBtb2RlbCBhbmQgZGF0YQpzYXZlUkRTKG1vZF9FZm0sIGZpbGUgPSBoZXJlKCJSZGF0YSIsICJtb2RfRWZtLnJkcyIpKQpzYXZlUkRTKGRhdF9FZm0sIGZpbGUgPSBoZXJlKCJSZGF0YSIsICJkYXRfRWZtLnJkcyIpKQpgYGAKClRoZSBha2Fpa2Ugd2VpZ2h0cyBmb3IgdGhlIHRvcCBzZXQgb2YgbW9kZWxzIHdpdGggQUlDIDwgNgoKYGBge3J9CmRhdF9FZm0gPC0gcmVhZFJEUyhmaWxlID0gaGVyZSgiUmRhdGEiLCAiZGF0X0VmbS5yZHMiKSkKbW9kX0VmbSA8LSByZWFkUkRTKGZpbGUgPSBoZXJlKCJSZGF0YSIsICJtb2RfRWZtLnJkcyIpKQpyZXNfRWZtIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgInJlc19FZm0ucmRzIikpCnJlc19FZm0yPC0gc3Vic2V0KHJlc19FZm0sIGRlbHRhIDw9IDYsIHJlY2FsYy53ZWlnaHRzPUZBTFNFKQppbXBvcnRhbmNlKHJlc19FZm0yKQpgYGAKCiMjIyMgRnVubmVsIHBsb3QKClVzZWQgdG8gcHJvZHVjZSBGaWcuIDdhCmBgYCB7cn0KCiMgZnVubmVsIHBsb3QKRnVubmVsX0U8LWZ1bm5lbChtb2RfRWZtLCB4bGFiID0gImxuUlIiLCB5bGFiID0gIlN0YW5kYXJkIEVycm9yIikKI0Z1bm5lbF9FCgpgYGAKKipGaWcuN2EqKiBGdW5uZWwgcGxvdCBzaG93aW5nIHRoZSBzdGFuZGFyZCBlcnJvciBhbmQgcmVzaWR1YWxzIChsblJSKSBmcm9tIHRoZSBmdWxsIG1vZGVsLgoKYGBgIHtyfQojeWVhciBwdWJsaXNoZWQgd2FzIHNjYWxlZCBwcmV2aW91c2x5ICB1bmRlciBzdHJlc3MgUEIKZGF0X0VmbSRzcXJ0X2ludl9lX24gPC0gd2l0aChkYXRfRWZtLCBzcXJ0KDEvQ0NfbiArIDEvRUNfbiArIDEvRVNfbiArIDEvQ1NfbikpCgpQQl9NUl9FPC0gcm1hLm12KGxuUlJfU2EsIGxuUlJWX1MsIG1vZHMgPSB+MSArIHNxcnRfaW52X2VfbiArICBMZWFybmluZ192c19tZW1vcnkgKyBZZWFyX3B1Ymxpc2hlZCArIFR5cGVfYXNzYXkgKyBUeXBlX3JlaW5mb3JjZW1lbnQgKyBFRV9zb2NpYWwgKyBFRV9leGVyY2lzZSArIEFnZV9zdHJlc3NfZXhwb3N1cmUsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksIG1ldGhvZCA9ICJSRU1MIiwgdGVzdCA9ICJ0IiwgCiAgICBkYXRhID0gZGF0X0VmbSkKCiNQQl9NUl9FCgplc3RpbWF0ZXNfUEJfTVJfRTwtIGVzdGltYXRlcy5DSShQQl9NUl9FKQojZXN0aW1hdGVzX1BCX01SX0UKYGBgCgojIyMjIExlYXZlLW9uZS1vdXQgYW5hbHlzaXMKSW5kaXZpZHVhbGx5IHJlbW92aW5nIHN0dWRpZXMgdG8gZGlzdGluZ3Vpc2ggdGhhdCBubyBzaW5ndWxhciBzdHVkeSBpcyBoYXZpbmcgYSBkaXNwcm9wb3J0aW9uYXRlIGVmZmVjdAoKYGBgIHtyLCBldmFsID0gRkFMU0V9CmRhdCRTdHVkeV9JRCA8LSBhcy5mYWN0b3IoZGF0JFN0dWR5X0lEKQoKTGVhdmVPbmVPdXRfZWZmZWN0c2l6ZSA8LSBsaXN0KCkKZm9yKGkgaW4gMTpsZW5ndGgobGV2ZWxzKGRhdCRTdHVkeV9JRCkpKXsKICAKICBkIDwtIGRhdCAlPiUgZmlsdGVyKFN0dWR5X0lEICE9IGxldmVscyhkYXQkU3R1ZHlfSUQpW2ldKQogIAogIFZDVl9FYiA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkJGxuUlJWX0UsIGNsdXN0ZXIgPSBkJFN0dWR5X0lELCByID0gMC41KQogIAogIExlYXZlT25lT3V0X2VmZmVjdHNpemVbW2ldXSA8LSBybWEubXYoeWkgPSBsblJSX0VhLCBWID0gVkNWX0ViLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IGxpc3QofjEgfCBTdHVkeV9JRCx+MXwgRVNfSUQsIH4xIHwgU3RyYWluKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiUkVNTCIsIGRhdGEgPSBkYXRbZGF0JFN0dWR5X0lECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gbGV2ZWxzKGRhdCRTdHVkeV9JRClbaV0sIF0pfQoKI1RPRE8gU2hpbmljaGkgdG8gY2hlY2sKCiMgd3JpdGluZyBmdW5jdGlvbiBmb3IgZXh0cmFjdGluZyBlc3QsIGNpLmxiLCBhbmQgY2kudWIgZnJvbSBhbGwgbW9kZWxzCmVzdC5mdW5jIDwtIGZ1bmN0aW9uKG1vZF9FMCl7CiAgZGYgPC0gZGF0YS5mcmFtZShlc3QgPSBtb2RfRTAkYiwgbG93ZXIgPSBtb2RfRTAkY2kubGIsIHVwcGVyID0gbW9kX0UwJGNpLnViKQogIHJldHVybihkZikKfQoKCgojdXNpbmcgZHBseXIgdG8gZm9ybSBkYXRhIGZyYW1lCk1BX0NWUl9FIDwtIGxhcHBseShMZWF2ZU9uZU91dF9lZmZlY3RzaXplLCBmdW5jdGlvbih4KSBlc3QuZnVuYyh4KSklPiUgYmluZF9yb3dzICU+JSBtdXRhdGUobGVmdF9vdXQgPSBsZXZlbHMoZGF0JFN0dWR5X0lEKSkKCgpzYXZlUkRTKE1BX0NWUl9FLGZpbGUgPSBoZXJlKCJSZGF0YSIsICJNQV9DVlJfRS5yZHMiKSkKYGBgCgpVc2VkIHRvIHByb2R1Y2UgRmlnLiBTMwpgYGAge3J9CiN0ZWxsaW5nIGdncGxvdCB0byBzdG9wIHJlb3JkZXJpbmcgZmFjdG9ycwpNQV9DVlJfRSA8LSByZWFkUkRTKGZpbGUgPSBoZXJlKCJSZGF0YSIsICJNQV9DVlJfRS5yZHMiKSkKCk1BX0NWUl9FJGxlZnRfb3V0PC0gYXMuZmFjdG9yKE1BX0NWUl9FJGxlZnRfb3V0KQpNQV9DVlJfRSRsZWZ0X291dDwtZmFjdG9yKE1BX0NWUl9FJGxlZnRfb3V0LCBsZXZlbHMgPSBNQV9DVlJfRSRsZWZ0X291dCkKCgojcGxvdHRpbmcKbGVhdmVvbmVvdXRfRSA8LSBnZ3Bsb3QoTUFfQ1ZSX0UpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyLCBsd2QgPSAxKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbW9kX0UwJGNpLmxiLCBsdHkgPSAzLCBsd2QgPSAwLjc1LCBjb2xvdXIgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbW9kX0UwJGIsIGx0eSA9IDEsIGx3ZCA9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtb2RfRTAkY2kudWIsIGx0eSA9IDMsIGx3ZCA9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHggPSBsZWZ0X291dCwgeSA9IGVzdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpKSArCiAgeGxhYigiU3R1ZHkgbGVmdCBvdXQiKSArIAogIHlsYWIoImxuUlIsIDk1JSBDSSIpICsgCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsKICB0aGVtZV9idygpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSApICsKICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpCgpsZWF2ZW9uZW91dF9FCgpkYXQkU3R1ZHlfSUQgPC0gYXMuaW50ZWdlcihkYXQkU3R1ZHlfSUQpCmBgYAoqKkZpZy4gUzMqKiBMZWF2ZS1vbmUtZ3JvdXAtb3V0IGFuYWx5c2lzIHNob3dpbmcgbWV0YS1hbmFseXRpYyBtZWFuIGFuZCA5NSUgQ0kgd2hlbiBlYWNoIGluZGl2aWR1YWwgc3R1ZHkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhIHNldC4gCgojIyMjIFVzaW5nIFNNRApSZS1yZXJ1bm5pbmcgbWV0YS1hbmFseXRpYyBtb2RlbCB1c2luZyBzdGFuZGFyZGlzZWQgbWVhbiBkaWZmZXJlbmNlIChTTUQpIGluc3RlYWQgb2YgbG5SUgoKYGBgIHtyfQoKbW9kX0UwYSA8LSBybWEubXYoeWkgPSBTTURfRWEsIFYgPSBWQ1ZfRWEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX0UwYSkKaTJfbWwobW9kX0UwYSkKCmBgYAoKIyMgTWFpbiBlZmZlY3Q6IHN0cmVzcwoKIyMjIE1ldGEtYW5hbHlzaXMKCmBgYCB7cn0KbW9kX1MwIDwtIHJtYS5tdih5aSA9IGxuUlJfU2EsIFYgPSBWQ1ZfUywgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLCAKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQoKc3VtbWFyeShtb2RfUzApIAppMl9tbChtb2RfUzApIAoKb3JjaGFyZF9wbG90KG1vZF9TMCwgbW9kID0gIkludCIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpIApgYGAKKipGaWcuIDMqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyBtZXRhLWFuYWx5dGljIG1lYW4gYW5kIDk1JSBjb25maWRlbmNlIGludGVydmFsICh0aGluayBibGFjayBsaW5lKSBhbmQgOTUlIHByZWRpY3Rpb24gaW50ZXJ2YWwgKHRoaW4gYmxhY2sgbGluZSkuIEluZGl2aWR1YWxzIHBvaW50cyBzaG93IG9ic2VydmVkIGVmZmVjdCBzaXplcyBhbmQgc2FtcGxlIHNpemVzLiAgCgojIyMgTWV0YS1yZWdyZXNzaW9uOiB1bmktbW9kZXJhdG9yIHsudGFic2V0fQoKIyMjIyBMZWFybmluZyB2cyBNZW1vcnkKV2FzIHRoZSByZXNwb25zZSBsZWFybmluZyBvciBtZW1vcnk/CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQoKbW9kX1MxIDwtICBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1MsIG1vZCA9IH5MZWFybmluZ192c19tZW1vcnktMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX1MxKSAKcjJfbWwobW9kX1MxKSAKCkx2c01fUyA8LSBvcmNoYXJkX3Bsb3QobW9kX1MxLCBtb2QgPSAiTGVhcm5pbmdfdnNfbWVtb3J5IiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkzNCIsImdyZXkzNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdyZXkzNCIsImdyZXkzNCIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpMdnNNX1MgCmBgYAoqKkZpZy4gNWEqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ0xlYXJuaW5nX3ZzX21lbW9yeScgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4gICAKCiMjIyMgVHlwZSBvZiBhc3NheQpUaGUgYnJvYWQgY2F0ZWdvcnkgb2YgdGhlIHR5cGUgb2YgYXNzYXkgdXNlZCB0byBtZWFzdXJlIGxlYXJuaW5nIG9yIG1lbW9yeSAKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmRhdCRUeXBlX2Fzc2F5PC1hcy5mYWN0b3IoZGF0JFR5cGVfYXNzYXkpCgpWQ1ZfUzEgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0MSRsblJSVl9TLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKCm1vZF9TMiA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1MxLCBtb2QgPSB+VHlwZV9hc3NheS0xLCByYW5kb20gPSAgIGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDEpCgpzdW1tYXJ5KG1vZF9TMikKcjJfbWwobW9kX1MyKSAKCkxlYXJuaW5nX1MgPC1vcmNoYXJkX3Bsb3QobW9kX1MyLCBtb2QgPSAiVHlwZV9hc3NheSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiLCJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiLCJncmV5MzQiKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCkxlYXJuaW5nX1MKYGBgCioqRmlnLiA1YioqIE9yY2hhcmQgcGxvdCBzaG93aW5nIHRoZSBncm91cC13aXNlIG1lYW5zIG9mIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAnVHlwZV9hc3NheScgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMgVHlwZSBvZiByZWluZm9yY2VtZW50CklmIGNvbmRpdGlvbmluZyB3YXMgdXNlZCwgd2FzIGF2ZXJzaXZlIG9yIGFwcGV0aXRpdmUgcmVpbmZvcmNlbWVudCB1c2VkPwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KClZDVl9TMiA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQyJGxuUlJWX1MsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpCgptb2RfUzMgPC0gcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9TMiwgbW9kID0gfiBUeXBlX3JlaW5mb3JjZW1lbnQtMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDIpCgpzdW1tYXJ5KG1vZF9TMykKcjJfbWwobW9kX1MzKSAKClJlaW5mb3JjZW1lbnRfUyA8LW9yY2hhcmRfcGxvdChtb2RfUzMsIG1vZCA9ICJUeXBlX3JlaW5mb3JjZW1lbnQiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IikpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKClJlaW5mb3JjZW1lbnRfUwpgYGBgCioqRmlnLiA1YyoqIE9yY2hhcmQgcGxvdCBzaG93aW5nIHRoZSBncm91cC13aXNlIG1lYW5zIG9mIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAnVHlwZV9yZWluZm9yY2VtZW50JyB3aXRoIHRoZWlyIDk1JSBjb25maWRlbmNlIGludGVydmFsICh0aGluayBibGFjayBsaW5lKSBhbmQgOTUlIHByZWRpY3Rpb24gaW50ZXJ2YWwgKHRoaW4gYmxhY2sgbGluZSkuIEluZGl2aWR1YWxzIHBvaW50cyBzaG93IG9ic2VydmVkIGVmZmVjdCBzaXplcyBhbmQgc2FtcGxlIHNpemVzLgoKIyMjIyBBZ2Ugb2Ygc3RyZXNzClRoZSBhZ2Ugd2hlbiBpbmRpdmlkdWFscyB3ZXJlIGV4cG9zZWQgdG8gc3RyZXNzCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQoKbW9kX1M0IDwtcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9TLCBtb2QgPSB+QWdlX3N0cmVzc19leHBvc3VyZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQpzdW1tYXJ5KG1vZF9TNCkgCnIyX21sKG1vZF9TNCkgCgpBZ2VfUyA8LSBvcmNoYXJkX3Bsb3QobW9kX1M0LCBtb2QgPSAiQWdlX3N0cmVzc19leHBvc3VyZSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiLCJncmV5MzQiLCAiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IikpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpBZ2VfUyAKYGBgCioqRmlnLiA1ZCoqIE9yY2hhcmQgcGxvdCBzaG93aW5nIHRoZSBncm91cC13aXNlIG1lYW5zIG9mIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAnQWdlX3N0cmVzc19leHBvc3VyZScgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMgVHlwZSBvZiBzdHJlc3MKVGhlIHR5cGUgb2Ygc3RyZXNzb3IgdXNlZAoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KZGF0NSA8LSBmaWx0ZXIoZGF0LCBUeXBlX3N0cmVzc19leHBvc3VyZSAlaW4lIGMoIlJlc3RyYWludCIsICJOb2lzZSIsICJNUyIsICJDb21iaW5hdGlvbiIpKQpWQ1ZfUzMgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0NSRsblJSVl9TLCBjbHVzdGVyID0gZGF0NSRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9TNCA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1MzLCBtb2QgPSB+VHlwZV9zdHJlc3NfZXhwb3N1cmUtMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDUpCnN1bW1hcnkobW9kX1M0KSAKcjJfbWwobW9kX1M0KQoKU3RyZXNzb3I8LSBvcmNoYXJkX3Bsb3QobW9kX1M0LCBtb2QgPSAiVHlwZV9zdHJlc3NfZXhwb3N1cmUiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IiwgImdyZXkzNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpIAoKU3RyZXNzb3IKYGBgYAoqKkZpZy4gNWUqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ1R5cGVfc3RyZXNzX2V4cG9zdXJlJyB3aXRoIHRoZWlyIDk1JSBjb25maWRlbmNlIGludGVydmFsICh0aGluayBibGFjayBsaW5lKSBhbmQgOTUlIHByZWRpY3Rpb24gaW50ZXJ2YWwgKHRoaW4gYmxhY2sgbGluZSkuIEluZGl2aWR1YWxzIHBvaW50cyBzaG93IG9ic2VydmVkIGVmZmVjdCBzaXplcyBhbmQgc2FtcGxlIHNpemVzLgoKIyMjIyBTdGVzcyBkdXJhdGlvbgpXYXMgdGhlIHN0cmVzcyBhY3V0ZSBvciBjaHJvbmljPwoKYGBgIHtyLCAgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmRhdDYgPC0gZmlsdGVyKGRhdCwgU3RyZXNzX2R1cmF0aW9uICVpbiUgYygiQ2hyb25pYyIsICJBY3V0ZSIpKQpWQ1ZfUzQgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0NiRsblJSVl9TLCBjbHVzdGVyID0gZGF0NiRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9TNSA8LXJtYS5tdih5aSA9IGxuUlJfU2EsIFYgPSBWQ1ZfUzQsIG1vZCA9IH5TdHJlc3NfZHVyYXRpb24tMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQ2KQpzdW1tYXJ5KG1vZF9TNSkgCnIyX21sKG1vZF9TNSkgCgpEdXJhdGlvbl9TIDwtIG9yY2hhcmRfcGxvdChtb2RfUzUsIG1vZCA9ICJTdHJlc3NfZHVyYXRpb24iLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IikpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpEdXJhdGlvbl9TIApgYGAKKipGaWcuIDVmKiogT3JjaGFyZCBwbG90IHNob3dpbmcgdGhlIGdyb3VwLXdpc2UgbWVhbnMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlICdTdHJlc3NfZHVyYXRpb24nIHdpdGggdGhlaXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKHRoaW5rIGJsYWNrIGxpbmUpIGFuZCA5NSUgcHJlZGljdGlvbiBpbnRlcnZhbCAodGhpbiBibGFjayBsaW5lKS4gSW5kaXZpZHVhbHMgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgZWZmZWN0IHNpemVzIGFuZCBzYW1wbGUgc2l6ZXMuCgojIyMgUHVibGljYXRpb24gYmlhcyAmIHNlbnNpdGl2aXR5IGFuYWx5c2lzIHsudGFic2V0fQojIyMjICBNdWx0aS1tb2RlcmF0b3IgbW9kZWwKCmBgYCB7ciwgZXZhbCA9IEZBTFNFfQoKI3NlbGVjdGluZyBtb2RlcmF0b3IgbGV2ZWxzIHdpdGggayA+PTUKZGF0X1NmbSA8LSBkYXQgJT4lCiAgZmlsdGVyKFR5cGVfYXNzYXkgJWluJSBjKCJSZWNvZ25pdGlvbiIsICJIYWJpdHVhdGlvbiIsICJDb25kaXRpb25pbmciKSwKICAgICAgICAgVHlwZV9yZWluZm9yY2VtZW50ICVpbiUgYygiQXBwZXRpdGl2ZSIsICJBdmVyc2l2ZSIsICJOb3QgYXBwbGljYWJsZSIpLAogICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSAlaW4lIGMoIlJlc3RyYWludCIsICJOb2lzZSIsICJNUyIsICJDb21iaW5hdGlvbiIpLAogICAgICAgICBTdHJlc3NfZHVyYXRpb24gJWluJSBjKCJDaHJvbmljIiwgIkFjdXRlIikpCgpWQ1ZfU2ZtIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdF9TZm0kbG5SUlZfRSwgY2x1c3RlciA9IGRhdF9TZm0kU3R1ZHlfSUQsIHIgPSAwLjUpCiAgICAgICAgICAgICAgICAgCm1vZF9TZm0gPC0gcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9TZm0sIG1vZCA9IH4gVHlwZV9hc3NheSAtMSArIExlYXJuaW5nX3ZzX21lbW9yeSArIFR5cGVfcmVpbmZvcmNlbWVudCArIFR5cGVfc3RyZXNzX2V4cG9zdXJlICsgQWdlX3N0cmVzc19leHBvc3VyZSArIFN0cmVzc19kdXJhdGlvbiwgcmFuZG9tID0gICBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRfU2ZtKQojc3VtbWFyeShtb2RfU2ZtKQojcjJfbWwobW9kX1NmbSkgCgpyZXNfU2ZtIDwtIGRyZWRnZShtb2RfU2ZtLCB0cmFjZT0yKQpzYXZlUkRTKHJlc19TZm0sIGZpbGUgPSBoZXJlKCJSZGF0YSIsICJyZXNfU2ZtLnJkcyIpKQojIGFsc28gc2F2aW5nIHRoZSBmdWxsIG1vZGVsIGFuZCBkYXRhCnNhdmVSRFMobW9kX1NmbSwgZmlsZSA9IGhlcmUoIlJkYXRhIiwgIm1vZF9TZm0ucmRzIikpCnNhdmVSRFMoZGF0X1NmbSwgZmlsZSA9IGhlcmUoIlJkYXRhIiwgImRhdF9TZm0ucmRzIikpCmBgYAoKVGhlIGFrYWlrZSB3ZWlnaHRzIGZvciB0aGUgdG9wIHNldCBvZiBtb2RlbHMgd2l0aCBBSUMgPCA2CgpgYGB7cn0KZGF0X1NmbSA8LSByZWFkUkRTKGZpbGUgPSBoZXJlKCJSZGF0YSIsICJkYXRfU2ZtLnJkcyIpKQptb2RfU2ZtIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgIm1vZF9TZm0ucmRzIikpCnJlc19TZm0gPC0gcmVhZFJEUyhmaWxlID0gaGVyZSgiUmRhdGEiLCAicmVzX1NmbS5yZHMiKSkKcmVzX1NmbTI8LSBzdWJzZXQocmVzX1NmbSwgZGVsdGEgPD0gNiwgcmVjYWxjLndlaWdodHM9RkFMU0UpCmltcG9ydGFuY2UocmVzX1NmbTIpIApgYGAKCiMjIyMgRnVubmVsIHBsb3QKVXNlZCB0byBwcm9kdWNlIEZpZy4gN2IKCmBgYCB7cn0KIyBmdW5uZWwgcGxvdApGdW5uZWxfUyA8LSBmdW5uZWwobW9kX1NmbSwgeGxhYiA9ICJsblJSIiwgeWxhYiA9ICJTdGFuZGFyZCBFcnJvciIpCkZ1bm5lbF9TCmBgYAoqKkZpZy43YioqIEZ1bm5lbCBwbG90IHNob3dpbmcgdGhlIHN0YW5kYXJkIGVycm9yIGFuZCByZXNpZHVhbHMgKGxuUlIpIGZyb20gdGhlIGZ1bGwgbW9kZWwuCgpgYGB7cn0KI2NhbGN1bGF0aW5nIGludiBlZmZlY3RpdmUgc2FtcGxlIHNpemUgZm9yIHVzZSBpbiBmdWxsIG1ldGEtcmVncmVzc2lvbgpkYXRfU2ZtJHNxcnRfaW52X2VfbiA8LSB3aXRoKGRhdF9TZm0sIHNxcnQoMS9DQ19uICsgMS9FQ19uICsgMS9FU19uICsgMS9DU19uKSkKCiN0aW1lIGxhZyBiaWFzIGFuZCBlZ2dlcnMgcmVncmVzc2lvbgpkYXRfU2ZtJGNfWWVhcl9wdWJsaXNoZWQgPC0gYXMudmVjdG9yKHNjYWxlKGRhdF9TZm0kWWVhcl9wdWJsaXNoZWQsIHNjYWxlID0gRikpCgpQQl9NUl9TPC0gcm1hLm12KGxuUlJfU2EsIGxuUlJWX1MsIG1vZHMgPSB+MSArIHNxcnRfaW52X2VfbiArICBjX1llYXJfcHVibGlzaGVkICsgVHlwZV9hc3NheSArTGVhcm5pbmdfdnNfbWVtb3J5ICsgVHlwZV9yZWluZm9yY2VtZW50ICsgVHlwZV9zdHJlc3NfZXhwb3N1cmUgKyBBZ2Vfc3RyZXNzX2V4cG9zdXJlLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLCAKICAgICAgICAgICAgICAgICBtZXRob2QgPSAiUkVNTCIsIAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsIAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRfU2ZtLAogICAgICAgICAgICAgICAgICBjb250cm9sPWxpc3Qob3B0aW1pemVyPSJvcHRpbSIsIG9wdG1ldGhvZD0iTmVsZGVyLU1lYWQiKSkKCiNQQl9NUl9TCgplc3RpbWF0ZXNfUEJfTVJfUzwtIGVzdGltYXRlcy5DSShQQl9NUl9TKQojZXN0aW1hdGVzX1BCX01SX1MKCmBgYAoKCiMjIyMgTGVhdmUtb25lLW91dCBzZW5zaXRpdml0eSBhbmFseXNpcwoKYGBgIHtyLCBldmFsID0gRkFMU0V9CmRhdCRTdHVkeV9JRCA8LSBhcy5mYWN0b3IoZGF0JFN0dWR5X0lEKQoKTGVhdmVPbmVPdXRfZWZmZWN0c2l6ZSA8LSBsaXN0KCkKZm9yKGkgaW4gMTpsZW5ndGgobGV2ZWxzKGRhdCRTdHVkeV9JRCkpKXsKICBkIDwtIGRhdCAlPiUgZmlsdGVyKFN0dWR5X0lEICE9IGxldmVscyhkYXQkU3R1ZHlfSUQpW2ldKQogIAogIFZDVl9TYiA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkJGxuUlJWX0UsIGNsdXN0ZXIgPSBkJFN0dWR5X0lELCByID0gMC41KQogIAogIExlYXZlT25lT3V0X2VmZmVjdHNpemVbW2ldXSA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1NiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IGxpc3QofjEgfCBTdHVkeV9JRCx+MXwgRVNfSUQsIH4xIHwgU3RyYWluKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiUkVNTCIsIGRhdGEgPSBkYXRbZGF0JFN0dWR5X0lECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gbGV2ZWxzKGRhdCRTdHVkeV9JRClbaV0sIF0pfQoKCiMgd3JpdGluZyBmdW5jdGlvbiBmb3IgZXh0cmFjdGluZyBlc3QsIGNpLmxiLCBhbmQgY2kudWIgZnJvbSBhbGwgbW9kZWxzCmVzdC5mdW5jIDwtIGZ1bmN0aW9uKG1vZF9TMCl7CiAgZGYgPC0gZGF0YS5mcmFtZShlc3QgPSBtb2RfUzAkYiwgbG93ZXIgPSBtb2RfUzAkY2kubGIsIHVwcGVyID0gbW9kX1MwJGNpLnViKQogIHJldHVybihkZikKfQoKCiN1c2luZyBkcGx5ciB0byBmb3JtIGRhdGEgZnJhbWUKTUFfQ1ZSX1MgPC0gbGFwcGx5KExlYXZlT25lT3V0X2VmZmVjdHNpemUsIGZ1bmN0aW9uKHgpIGVzdC5mdW5jKHgpKSU+JSBiaW5kX3Jvd3MgJT4lIG11dGF0ZShsZWZ0X291dCA9IGxldmVscyhkYXQkU3R1ZHlfSUQpKQoKc2F2ZVJEUyhNQV9DVlJfUyxmaWxlID0gaGVyZSgiUmRhdGEiLCAiTUFfQ1ZSX1MucmRzIikpCgpgYGAKClVzZWQgdG8gcHJvZHVjZSBGaWcuIFM0CmBgYCB7cn0KTUFfQ1ZSX1MgPC0gcmVhZFJEUyhmaWxlID0gaGVyZSgiUmRhdGEiLCAiTUFfQ1ZSX1MucmRzIikpCgojdGVsbGluZyBnZ3Bsb3QgdG8gc3RvcCByZW9yZGVyaW5nIGZhY3RvcnMKTUFfQ1ZSX1MkbGVmdF9vdXQ8LSBhcy5mYWN0b3IoTUFfQ1ZSX1MkbGVmdF9vdXQpCk1BX0NWUl9TJGxlZnRfb3V0PC1mYWN0b3IoTUFfQ1ZSX1MkbGVmdF9vdXQsIGxldmVscyA9IE1BX0NWUl9TJGxlZnRfb3V0KQoKI3Bsb3R0aW5nCmxlYXZlb25lb3V0X1MgPC0gZ2dwbG90KE1BX0NWUl9TKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMiwgbHdkID0gMSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vZF9TMCRjaS5sYiwgbHR5ID0gMywgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vZF9TMCRiLCBsdHkgPSAxLCBsd2QgPSAwLjc1LCBjb2xvdXIgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbW9kX1MwJGNpLnViLCBsdHkgPSAzLCBsd2QgPSAwLjc1LCBjb2xvdXIgPSAiYmxhY2siKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh4ID0gbGVmdF9vdXQsIHkgPSBlc3QsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSkgKwogIHhsYWIoIlN0dWR5IGxlZnQgb3V0IikgKyAKICB5bGFiKCJsblJSLCA5NSUgQ0kiKSArIAogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrCiAgdGhlbWVfYncoKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCkgKSArCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKQoKbGVhdmVvbmVvdXRfUwoKZGF0JFN0dWR5X0lEIDwtIGFzLmludGVnZXIoZGF0JFN0dWR5X0lEKQpgYGAKKipGaWcuIFM0KiogTGVhdmUtb25lLWdyb3VwLW91dCBhbmFseXNpcyBzaG93aW5nIG1ldGEtYW5hbHl0aWMgbWVhbiBhbmQgOTUlIENJIHdoZW4gZWFjaCBpbmRpdmlkdWFsIHN0dWR5IGlzIHJlbW92ZWQgZnJvbSB0aGUgZGF0YSBzZXQuIAoKIyMjIyBVc2luZyBTTUQKUmUtcmVydW5uaW5nIG1ldGEtYW5hbHl0aWMgbW9kZWwgdXNpbmcgc3RhbmRhcmRpc2VkIG1lYW4gZGlmZmVyZW5jZSAoU01EKSBpbnN0ZWFkIG9mIGxuUlIKCmBgYCB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9Cm1vZF9TMGEgPC0gcm1hLm12KHlpID0gU01EX1NhLCBWID0gVkNWX1NhLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQpzdW1tYXJ5KG1vZF9TMGEpIAppMl9tbChtb2RfUzBhKSAKCmBgYAoKIyMgSW50ZXJhY3Rpb246IGVucmljaG1lbnQgeCBzdHJlc3MKCiMjIyBNZXRhLWFuYWx5c2lzCgpgYGAge3J9Cm1vZF9FUzAgPC0gcm1hLm12KHlpID0gbG5SUl9FU2EsIFYgPSBWQ1ZfRVMsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsIAogICAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQoKc3VtbWFyeShtb2RfRVMwKSAKaTJfbWwobW9kX0VTMCkgCgpvcmNoYXJkX3Bsb3QobW9kX0VTMCwgbW9kID0gIkludCIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpIApgYGBgCioqRmlnLiAzKiogT3JjaGFyZCBwbG90IHNob3dpbmcgbWV0YS1hbmFseXRpYyBtZWFuIGFuZCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4gCgojIyMgIE1ldGEtcmVncmVzc2lvbjogdW5pLW1vZGVyYXRvciB7LnRhYnNldH0KCiMjIyMgTGVhcm5pbmcgdnMgTWVtb3J5CldhcyB0aGUgcmVzcG9uc2UgbGVhcm5pbmcgb3IgbWVtb3J5PwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KbW9kX0VTMSA8LSAgcm1hLm12KHlpID0gbG5SUl9FU2EsIFYgPSBWQ1ZfRVMsIG1vZCA9IH5MZWFybmluZ192c19tZW1vcnktMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX0VTMSkgCnIyX21sKG1vZF9FUzEpIAoKTHZzTV9FUyA8LSBvcmNoYXJkX3Bsb3QobW9kX0VTMSwgbW9kID0gIkxlYXJuaW5nX3ZzX21lbW9yeSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSAzLCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgCgpMdnNNX0VTIApgYGAKKipGaWcuIDZhKiogT3JjaGFyZCBwbG90IHNob3dpbmcgdGhlIGdyb3VwLXdpc2UgbWVhbnMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlICdMZWFybmluZ192c19tZW1vcnknIHdpdGggdGhlaXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKHRoaW5rIGJsYWNrIGxpbmUpIGFuZCA5NSUgcHJlZGljdGlvbiBpbnRlcnZhbCAodGhpbiBibGFjayBsaW5lKS4gSW5kaXZpZHVhbHMgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgZWZmZWN0IHNpemVzIGFuZCBzYW1wbGUgc2l6ZXMuIAoKIyMjIyBUeXBlIG9mIGFzc2F5ClRoZSBicm9hZCBjYXRlZ29yeSBvZiB0aGUgdHlwZSBvZiBhc3NheSB1c2VkIHRvIG1lYXN1cmUgbGVhcm5pbmcgb3IgbWVtb3J5IAoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KVkNWX0VTMSA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQxJGxuUlJWX0VTLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX0VTMiA8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUzEsIG1vZCA9IH5UeXBlX2Fzc2F5LTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgICBkYXRhID0gZGF0MSkKCnN1bW1hcnkobW9kX0VTMikKcjJfbWwobW9kX0VTMikgCgpMZWFybmluZ19FUyA8LSBvcmNoYXJkX3Bsb3QobW9kX0VTMiwgbW9kID0gIlR5cGVfYXNzYXkiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IikpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gMywgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpIAoKTGVhcm5pbmdfRVMKYGBgCioqRmlnLiA2YioqIE9yY2hhcmQgcGxvdCBzaG93aW5nIHRoZSBncm91cC13aXNlIG1lYW5zIG9mIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAnVHlwZV9hc3NheScgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMgVHlwZSBvZiByZWluZm9yY2VtZW50CklmIGNvbmRpdGlvbmluZyB3YXMgdXNlZCwgd2FzIGF2ZXJzaXZlIG9yIGFwcGV0aXRpdmUgcmVpbmZvcmNlbWVudCB1c2VkPwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KVkNWX0VTMiA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQyJGxuUlJWX0VTLCBjbHVzdGVyID0gZGF0MiRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9FUzMgPC0gcm1hLm12KHlpID0gbG5SUl9FU2EsIFYgPSBWQ1ZfRVMyLCBtb2QgPSB+IFR5cGVfcmVpbmZvcmNlbWVudC0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQyKQoKc3VtbWFyeShtb2RfRVMzKQpyMl9tbChtb2RfRVMzKSAKClJlaW5mb3JjZW1lbnRfRVMgPC0gb3JjaGFyZF9wbG90KG1vZF9FUzMsIG1vZCA9ICJUeXBlX3JlaW5mb3JjZW1lbnQiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IikpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gMywgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpIAoKUmVpbmZvcmNlbWVudF9FUyAKYGBgYAoqKkZpZy4gNmMqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ1R5cGVfcmVpbmZvcmNlbWVudCcgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMgQWdlIG9mIGVucmljaG1lbnQKVGhlIGFnZSB3aGVuIGluZGl2aWR1YWxzIHdlcmUgZXhwb3NlZCB0byBlbnZpcm9ubWVudGFsIGVucmljaG1lbnQKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9ClZDVl9FUzMgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0MyRsblJSVl9FUywgY2x1c3RlciA9IGRhdDMkU3R1ZHlfSUQsIHIgPSAwLjUpCgptb2RfRVM0IDwtIHJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTMywgbW9kID0gfkFnZV9FRV9leHBvc3VyZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQzKQoKc3VtbWFyeShtb2RfRVM0KSAKcjJfbWwobW9kX0VTNCkgCgpBZ2VfZW5yaWNobWVudF9FUyA8LSBvcmNoYXJkX3Bsb3QobW9kX0VTNCwgbW9kID0gIkFnZV9FRV9leHBvc3VyZSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSAzLCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKCkFnZV9lbnJpY2htZW50X0VTCmBgYAoqKkZpZy4gNmQqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ0FnZV9FRV9leHBvc3VyZScgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMgRXhlcmNpc2UgZW5yaWNobWVudApEaWQgZW5yaWNobWVudCBpbnZvbHZlIHRoZSBhZGRpdGlvbiBvZiBhcHBhcmF0dXMgZm9yIHZvbHVudGFyeSBleGVyY2lzZSAoZS5nLiwgYSB3aGVlbCBvciB0cmVhZG1pbGwpPwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KbW9kX0VTNTwtIHJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTLCBtb2QgPSB+RUVfZXhlcmNpc2UtMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwgCiAgICB+MXxFU19JRCwKICAgIH4xfFN0cmFpbiksCiAgICAgdGVzdCA9ICJ0IiwKICAgICBkYXRhID0gZGF0KQoKc3VtbWFyeShtb2RfRVM1KQpyMl9tbChtb2RfRVM1KSAKCkV4ZXJjaXNlX0VTIDwtIG9yY2hhcmRfcGxvdChtb2RfRVM1LCBtb2QgPSAiRUVfZXhlcmNpc2UiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IikpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gMywgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgCgpFeGVyY2lzZV9FUwpgYGAKKipGaWcuIDZkKiogT3JjaGFyZCBwbG90IHNob3dpbmcgdGhlIGdyb3VwLXdpc2UgbWVhbnMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlICdFRV9leGVyY2lzZScgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMgU29jaWFsIGVucmljaG1lbnQKRGlkIGVucmljaG1lbnQgaW52b2x2ZSBtb3JlIGNvbnNwZWNpZmljcyAobm90ZSB0aGF0IHdlIGRpZCBub3QgaW5jbHVkZSBzdHVkaWVzIHRoYXQgb25seSBwcm92aWRlZCBzb2NpYWwgZW5yaWNobWVudCBidXQgbm8gb3RoZXIgZm9ybSBvZiBhYmlvdGljIGVucmljaG1lbnQpPwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KVkNWX0VTNCA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQ0JGxuUlJWX0VTLCBjbHVzdGVyID0gZGF0NCRTdHVkeV9JRCwgciA9IDAuNSkKbW9kX0VTNjwtIHJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTNCwgbW9kID0gfkVFX3NvY2lhbC0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0NCkKCnN1bW1hcnkobW9kX0VTNikKcjJfbWwobW9kX0VTNikgCgpTb2NpYWxfRVMgPC0gb3JjaGFyZF9wbG90KG1vZF9FUzYsIG1vZCA9ICJFRV9zb2NpYWwiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IikpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gMywgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpIAoKU29jaWFsX0VTCmBgYAoqKkZpZy4gNmUqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ0VFX3NvY2lhbCcgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMgQWdlIG9mIHN0cmVzcwpUaGUgYWdlIHdoZW4gaW5kaXZpZHVhbHMgd2VyZSBleHBvc2VkIHRvIHN0cmVzcwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KbW9kX0VTNyA8LXJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTLCBtb2QgPSB+QWdlX3N0cmVzc19leHBvc3VyZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX0VTNykgCnIyX21sKG1vZF9FUzcpIAoKQWdlX3N0cmVzc19FUzwtb3JjaGFyZF9wbG90KG1vZF9FUzcsIG1vZCA9ICJBZ2Vfc3RyZXNzX2V4cG9zdXJlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIsICJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiLCJncmV5MzQiLCJncmV5MzQiKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSAzLCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKCkFnZV9zdHJlc3NfRVMKYGBgCioqRmlnLiA2ZCoqIE9yY2hhcmQgcGxvdCBzaG93aW5nIHRoZSBncm91cC13aXNlIG1lYW5zIG9mIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAnQWdlX3N0cmVzc19leHBvc3VyZScgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMgVHlwZSBvZiBzdHJlc3MKVGhlIHR5cGUgb2Ygc3RyZXNzb3IgdXNlZAoKYGBgIHtyfQpWQ1ZfRVM1IDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDUkbG5SUlZfRVMsIGNsdXN0ZXIgPSBkYXQ1JFN0dWR5X0lELCByID0gMC41KQptb2RfRVM4IDwtIHJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTNSwgbW9kID0gflR5cGVfc3RyZXNzX2V4cG9zdXJlLTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDUpCnN1bW1hcnkobW9kX0VTOCkKcjJfbWwobW9kX0VTOCkKClN0cmVzc29yX0VTIDwtIG9yY2hhcmRfcGxvdChtb2RfRVM4LCBtb2QgPSAiVHlwZV9zdHJlc3NfZXhwb3N1cmUiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IiwgImdyZXkzNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDMsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAgCgpTdHJlc3Nvcl9FUyAKYGBgYAoqKkZpZy4gNmUqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ1R5cGVfc3RyZXNzX2V4cG9zdXJlJyB3aXRoIHRoZWlyIDk1JSBjb25maWRlbmNlIGludGVydmFsICh0aGluayBibGFjayBsaW5lKSBhbmQgOTUlIHByZWRpY3Rpb24gaW50ZXJ2YWwgKHRoaW4gYmxhY2sgbGluZSkuIEluZGl2aWR1YWxzIHBvaW50cyBzaG93IG9ic2VydmVkIGVmZmVjdCBzaXplcyBhbmQgc2FtcGxlIHNpemVzLgoKIyMjIyBTdHJlc3MgZHVyYXRpb24KV2FzIHRoZSBzdHJlc3MgYWN1dGUgb3IgY2hyb25pYz8KCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9ClZDVl9FUzYgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0NiRsblJSVl9FUywgY2x1c3RlciA9IGRhdDYkU3R1ZHlfSUQsIHIgPSAwLjUpCgptb2RfRVM5IDwtcm1hLm12KHlpID0gbG5SUl9FU2EsIFYgPSBWQ1ZfRVM2LCBtb2QgPSB+U3RyZXNzX2R1cmF0aW9uLTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQ2KQpzdW1tYXJ5KG1vZF9FUzkpIApyMl9tbChtb2RfRVM5KSAKCgpEdXJhdGlvbl9FUzwtIG9yY2hhcmRfcGxvdChtb2RfRVM5LCBtb2QgPSAiU3RyZXNzX2R1cmF0aW9uIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gMywgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IikpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKCkR1cmF0aW9uX0VTCmBgYAoqKkZpZy4gNmYqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ1N0cmVzc19kdXJhdGlvbicgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMgT3JkZXIgdG8gdHJlYXRtZW50IGV4cG9zdXJlClRoZSBvcmRlciBpbiB3aGljaCBpbmRpdmlkdWFscyB3ZXJlIGV4cG9zZWQgdG8gZW5yaWNobWVudCBhbmQgc3RyZXNzCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQptb2RfRVMxMCA8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUywgbW9kID0gfkV4cG9zdXJlX29yZGVyIC0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELCAKICAgIH4xfEVTX0lELAogICAgfjF8U3RyYWluKSwKICAgICB0ZXN0ID0gInQiLAogICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9FUzEwKQpyMl9tbChtb2RfRVMxMCkKCk9yZGVyX0VTIDwtIG9yY2hhcmRfcGxvdChtb2RfRVMxMCwgbW9kID0gIkV4cG9zdXJlX29yZGVyIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDMsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKCk9yZGVyX0VTIApgYGAKKipGaWcuIDZnKiogT3JjaGFyZCBwbG90IHNob3dpbmcgdGhlIGdyb3VwLXdpc2UgbWVhbnMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlICdFeHBvc3VyZV9vcmRlcicgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyBQdWJsaWNhdGlvbiBiaWFzICYgc2Vuc2l0aXZpdHkgYW5hbHlzaXMgey50YWJzZXR9CgojIyMjICBNdWx0aS1tb2RlcmF0b3IgbW9kZWwKYGBgIHtyLCBldmFsID0gRkFMU0V9CmRhdF9FU2ZtIDwtIGRhdCAlPiUKICBmaWx0ZXIoVHlwZV9hc3NheSAlaW4lIGMoIlJlY29nbml0aW9uIiwgIkhhYml0dWF0aW9uIiwgIkNvbmRpdGlvbmluZyIpLAogICAgICAgICBUeXBlX3JlaW5mb3JjZW1lbnQgJWluJSBjKCJBcHBldGl0aXZlIiwgIkF2ZXJzaXZlIiwgIk5vdCBhcHBsaWNhYmxlIiksCiAgICAgICAgIEVFX3NvY2lhbCAlaW4lIGMoIlNvY2lhbCIsICJOb24tc29jaWFsIiksCiAgICAgICAgIEFnZV9FRV9leHBvc3VyZSAlaW4lIGMoIkFkdWx0IiwgIkFkb2xlc2NlbnQiKSwKICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgJWluJSBjKCJSZXN0cmFpbnQiLCAiTm9pc2UiLCAiTVMiLCAiQ29tYmluYXRpb24iKSwKICAgICAgICAgU3RyZXNzX2R1cmF0aW9uICVpbiUgYygiQ2hyb25pYyIsICJBY3V0ZSIpLCAKICAgICAgICAgQWdlX3N0cmVzc19leHBvc3VyZSAlaW4lIGMoIlByZW5hdGFsIiwgIkVhcmx5IHBvc3RuYXRhbCIsICJBZHVsdCIpKQoKVkNWX0VTZm0gPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0X0VTZm0kbG5SUlZfRVMsIGNsdXN0ZXIgPSBkYXRfRVNmbSRTdHVkeV9JRCwgciA9IDAuNSkKICAgICAgICAgICAgICAgICAKbW9kX0VTZm0gPC0gcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9FU2ZtLCBtb2QgPSB+VHlwZV9hc3NheS0xICsgTGVhcm5pbmdfdnNfbWVtb3J5ICsgVHlwZV9yZWluZm9yY2VtZW50ICsgRUVfc29jaWFsICsgRUVfZXhlcmNpc2UgKyBBZ2VfRUVfZXhwb3N1cmUgKyBUeXBlX3N0cmVzc19leHBvc3VyZSArIEFnZV9zdHJlc3NfZXhwb3N1cmUgKyBTdHJlc3NfZHVyYXRpb24gKyBFeHBvc3VyZV9vcmRlciwgcmFuZG9tID0gICBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRfRVNmbSkKI3N1bW1hcnkobW9kX0VTZm0pCiNyMl9tbChtb2RfRVNmbSkgCgoKcmVzX0VTZm0gPC0gZHJlZGdlKG1vZF9FU2ZtLCB0cmFjZT0yKQpzYXZlUkRTKHJlc19FU2ZtLCBmaWxlID0gaGVyZSgiUmRhdGEiLCAicmVzX0VTZm0ucmRzIikpCiMgYWxzbyBzYXZpbmcgdGhlIGZ1bGwgbW9kZWwgYW5kIGRhdGEKc2F2ZVJEUyhtb2RfRVNmbSwgZmlsZSA9IGhlcmUoIlJkYXRhIiwgIm1vZF9FU2ZtLnJkcyIpKQpzYXZlUkRTKGRhdF9FU2ZtLCBmaWxlID0gaGVyZSgiUmRhdGEiLCAiZGF0X0VTZm0ucmRzIikpCmBgYAoKVGhlIGFrYWlrZSB3ZWlnaHRzIGZvciB0aGUgdG9wIHNldCBvZiBtb2RlbHMgd2l0aCBBSUMgPCA2CgpgYGB7cn0KZGF0X0VTZm0gPC0gcmVhZFJEUyhmaWxlID0gaGVyZSgiUmRhdGEiLCAiZGF0X0VTZm0ucmRzIikpCm1vZF9FU2ZtIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgIm1vZF9FU2ZtLnJkcyIpKQpyZXNfRVNmbSA8LSByZWFkUkRTKGZpbGUgPSBoZXJlKCJSZGF0YSIsICJyZXNfRVNmbS5yZHMiKSkKcmVzX0VTZm0yPC0gc3Vic2V0KHJlc19FU2ZtLCBkZWx0YSA8PSA2LCByZWNhbGMud2VpZ2h0cz1GQUxTRSkKaW1wb3J0YW5jZShyZXNfRVNmbTIpIApgYGAKCiMjIyMgRnVubmVsIHBsb3QKVXNlZCB0byBwcm9kdWNlIEZpZy4gN2MKCmBgYCB7cn0KRnVubmVsX0VTPC1mdW5uZWwobW9kX0VTZm0sIHhsYWIgPSAibG5SUiIsIHlsYWIgPSAiU3RhbmRhcmQgRXJyb3IiKQpGdW5uZWxfRVMKYGBgCioqRmlnLjdjKiogRnVubmVsIHBsb3Qgc2hvd2luZyB0aGUgc3RhbmRhcmQgZXJyb3IgYW5kIHJlc2lkdWFscyAobG5SUikgZnJvbSB0aGUgZnVsbCBtb2RlbC4KCiMjIyMgTGVhdmUtb25lLW91dCBhbmFseXNpcwoKYGBgIHtyLCBldmFsID0gRkFMU0V9CmRhdCRTdHVkeV9JRCA8LSBhcy5mYWN0b3IoZGF0JFN0dWR5X0lEKQoKTGVhdmVPbmVPdXRfZWZmZWN0c2l6ZSA8LSBsaXN0KCkKZm9yKGkgaW4gMTpsZW5ndGgobGV2ZWxzKGRhdCRTdHVkeV9JRCkpKXsKICBkIDwtIGRhdCAlPiUgZmlsdGVyKFN0dWR5X0lEICE9IGxldmVscyhkYXQkU3R1ZHlfSUQpW2ldKQogIAogIFZDVl9FU2IgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZCRsblJSVl9FUywgY2x1c3RlciA9IGQkU3R1ZHlfSUQsIHIgPSAwLjUpCiAgTGVhdmVPbmVPdXRfZWZmZWN0c2l6ZVtbaV1dIDwtIHJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTYiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSBsaXN0KH4xIHwgU3R1ZHlfSUQsfjF8IEVTX0lELCB+MSB8IFN0cmFpbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIlJFTUwiLCBkYXRhID0gZGF0W2RhdCRTdHVkeV9JRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGxldmVscyhkYXQkU3R1ZHlfSUQpW2ldLCBdKX0KCgojIHdyaXRpbmcgZnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgZXN0LCBjaS5sYiwgYW5kIGNpLnViIGZyb20gYWxsIG1vZGVscwplc3QuZnVuYyA8LSBmdW5jdGlvbihtb2RfRVMwKXsKICBkZiA8LSBkYXRhLmZyYW1lKGVzdCA9IG1vZF9FUzAkYiwgbG93ZXIgPSBtb2RfRVMwJGNpLmxiLCB1cHBlciA9IG1vZF9FUzAkY2kudWIpCiAgcmV0dXJuKGRmKQp9CgoKI3VzaW5nIGRwbHlyIHRvIGZvcm0gZGF0YSBmcmFtZQpNQV9DVlJfRVMgPC0gbGFwcGx5KExlYXZlT25lT3V0X2VmZmVjdHNpemUsIGZ1bmN0aW9uKHgpIGVzdC5mdW5jKHgpKSU+JSBiaW5kX3Jvd3MgJT4lIG11dGF0ZShsZWZ0X291dCA9IGxldmVscyhkYXQkU3R1ZHlfSUQpKQoKc2F2ZVJEUyhNQV9DVlJfRVMsICxmaWxlID0gaGVyZSgiUmRhdGEiLCAiTUFfQ1ZSX0VTLnJkcyIpKQoKYGBgClVzZWQgdG8gcHJvZHVjZSBGaWcuIFM1CgpgYGAge3J9Ck1BX0NWUl9FUzwtIHJlYWRSRFMoaGVyZSgiUmRhdGEiLCAiTUFfQ1ZSX0VTLnJkcyIpKQoKI3RlbGxpbmcgZ2dwbG90IHRvIHN0b3AgcmVvcmRlcmluZyBmYWN0b3JzCk1BX0NWUl9FUyRsZWZ0X291dDwtIGFzLmZhY3RvcihNQV9DVlJfRVMkbGVmdF9vdXQpCk1BX0NWUl9FUyRsZWZ0X291dDwtZmFjdG9yKE1BX0NWUl9FUyRsZWZ0X291dCwgbGV2ZWxzID0gTUFfQ1ZSX0VTJGxlZnRfb3V0KQoKI3Bsb3R0aW5nCmxlYXZlb25lb3V0X0VTIDwtIGdncGxvdChNQV9DVlJfRVMpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyLCBsd2QgPSAxKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbW9kX0VTMCRjaS5sYiwgbHR5ID0gMywgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vZF9FUzAkYiwgbHR5ID0gMSwgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vZF9FUzAkY2kudWIsIGx0eSA9IDMsIGx3ZCA9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHggPSBsZWZ0X291dCwgeSA9IGVzdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpKSArCiAgeGxhYigiU3R1ZHkgbGVmdCBvdXQiKSArIAogIHlsYWIoImxuUlIsIDk1JSBDSSIpICsgCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsKICB0aGVtZV9idygpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSApICsKICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpCgpsZWF2ZW9uZW91dF9FUwoKZGF0JFN0dWR5X0lEIDwtIGFzLmludGVnZXIoZGF0JFN0dWR5X0lEKQpgYGAKKipGaWcuIFM1KiogTGVhdmUtb25lLWdyb3VwLW91dCBhbmFseXNpcyBzaG93aW5nIG1ldGEtYW5hbHl0aWMgbWVhbiBhbmQgOTUlIENJIHdoZW4gZWFjaCBpbmRpdmlkdWFsIHN0dWR5IGlzIHJlbW92ZWQgZnJvbSB0aGUgZGF0YSBzZXQuIAoKIyMjIyBVc2luZyBTTUQKUmUtcmVydW5uaW5nIG1ldGEtYW5hbHl0aWMgbW9kZWwgdXNpbmcgc3RhbmRhcmRpc2VkIG1lYW4gZGlmZmVyZW5jZSAoU01EKSBpbnN0ZWFkIG9mIGxuUgoKYGBgIHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KbW9kX0VTMGEgPC0gcm1hLm12KHlpID0gU01EX0VTYSwgViA9IFZDVl9FU2EsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQpzdW1tYXJ5KG1vZF9FUzBhKQppMl9tbChtb2RfRVMwYSkgCgpgYGAKCiMjICdQYWlyd2lzZScgZWZmZWN0IHNpemVzIHsudGFic2V0fQoKIyMjIEVucmljaG1lbnQgcmVsYXRpdmUgdG8gY29udHJvbAoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KClZDVl9FMjAgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JGxuUlJWX0UyLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX0UyMCA8LSBybWEubXYoeWkgPSBsblJSX0UyYSwgViA9IFZDVl9FMjAsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+IDF8U3RyYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQpLAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsIAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQsIAogICAgICAgICAgICAgICAgIGNvbnRyb2w9bGlzdChvcHRpbWl6ZXI9Im9wdGltIiwgb3B0bWV0aG9kPSJOZWxkZXItTWVhZCIpKQoKc3VtbWFyeShtb2RfRTIwKSAKaTJfbWwobW9kX0UyMCkgCgpvcmNoYXJkX3Bsb3QobW9kX0UyMCwgbW9kID0gIkludCIsIHhsYWIgPSAibG5SUiIpCmBgYAoKIyMjIFN0cmVzcyByZWxhdGl2ZSB0byBjb250cm9sCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpWQ1ZfUzIwIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdCRsblJSVl9TMiwgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9TMjAgPC0gcm1hLm12KHlpID0gbG5SUl9TMmEsIFYgPSBWQ1ZfUzIwLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4gMXxTdHJhaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQoKc3VtbWFyeShtb2RfUzIwKSAKaTJfbWwobW9kX1MyMCkgCiAKb3JjaGFyZF9wbG90KG1vZF9TMjAsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiKQpgYGAKCiMjIyBFbnJpY2htZW50ICsgc3RyZXNzIHJlbGF0aXZlIHRvIGNvbnRyb2wKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9ClZDVl9FUzIwIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdCRsblJSVl9FUzIsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpCgptb2RfRVMyMCA8LSBybWEubXYoeWkgPSBsblJSX0VTMmEsIFYgPSBWQ1ZfRVMyMCwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4gMXxTdHJhaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQpzdW1tYXJ5KG1vZF9FUzIwKSAKaTJfbWwobW9kX0VTMjApIAoKb3JjaGFyZF9wbG90KG1vZF9FUzIwLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIikKYGBgCgojIyMgRW5yaWNobWVudCArIHN0cmVzcyByZWxhdGl2ZSB0byBzdHJlc3MKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9ClZDVl9FMzAgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JGxuUlJWX0UzLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX0UzMCA8LSBybWEubXYoeWkgPSBsblJSX0UzYSwgViA9IFZDVl9FMzAsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+IDF8U3RyYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQpLAogICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQpzdW1tYXJ5KG1vZF9FMzApIAppMl9tbChtb2RfRTMwKSAKCm9yY2hhcmRfcGxvdChtb2RfRTMwLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIikKYGBgCgojIyMgRW5yaWNobWVudCArIHN0cmVzcyByZWxhdGl2ZSB0byBlbnJpY2htZW50CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpWQ1ZfUzMwIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdCRsblJSVl9TMywgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9TMzAgPC0gcm1hLm12KHlpID0gbG5SUl9TM2EsIFYgPSBWQ1ZfUzMwLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiAxfFN0cmFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lEKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCwKICAgICAgICAgICAgICAgICAgIGNvbnRyb2w9bGlzdChvcHRpbWl6ZXI9Im9wdGltIiwgb3B0bWV0aG9kPSJOZWxkZXItTWVhZCIpKQpzdW1tYXJ5KG1vZF9TMzApIAppMl9tbChtb2RfUzMwKSAKCm9yY2hhcmRfcGxvdChtb2RfUzMwLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIikKYGBgCgojIyBGaWd1cmVzCiMjIyBQYW5lbCBvZiAnZm9jYWwnIEVTIGFuZCAncGFpcndpc2UnIEVTIG9yY2hhcmQgcGxvdHMKVXNlZCB0byBwcm9kdWNlIEZpZy4gMwpgYGAge3J9Cm1vZF9saXN0MSA8LSBsaXN0KG1vZF9FMCwgbW9kX1MwLCBtb2RfRVMwKQoKbW9kX3JlczEgPC0gbGFwcGx5KG1vZF9saXN0MSwgZnVuY3Rpb24oeCkgbW9kX3Jlc3VsdHMoeCwgbW9kID0gIkludCIpKQoKbWVyZ2VkMSA8LSBzdWJtZXJnZShtb2RfcmVzMVtbM11dLCBtb2RfcmVzMVtbMl1dLCAgbW9kX3JlczFbWzFdXSwgbWl4ID0gVCkKbWVyZ2VkMSRtb2RfdGFibGUkbmFtZSA8LSBmYWN0b3IobWVyZ2VkMSRtb2RfdGFibGUkbmFtZSwgbGV2ZWxzID0gYygiSW50cmNwdDEiLCAKICAgICJJbnRyY3B0MiIsICJJbnRyY3B0MyIpLCAKICAgIGxhYmVscyA9IHJldihjKCJFbnJpY2htZW50IE1FIiwgIlN0cmVzcyBNRSIsICJJbnRlcmFjdGlvbiIpKSkKCm1lcmdlZDEkZGF0YSRtb2RlcmF0b3IgPC0gZmFjdG9yKG1lcmdlZDEkZGF0YSRtb2RlcmF0b3IsIGxldmVscyA9IGMoIkludHJjcHQxIiwgCiAgICAiSW50cmNwdDIiLCAiSW50cmNwdDMiKSwgCiAgICBsYWJlbHMgPSByZXYoYygiRW5yaWNobWVudCBNRSIsICJTdHJlc3MgTUUiLCAiSW50ZXJhY3Rpb24iKSkpCgpvcmNoYXJkMTwtIG9yY2hhcmRfcGxvdChtZXJnZWQxLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIiwgYW5nbGUgPSAwKSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMgCiAgeGxpbSgtMiw0LjUpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNCwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiMwMEFFRUYiLCIjMDBBNjUxIiwiI0VEMUMyNCIpKSsgIyBjaGFuZ2UgY29sb3VycwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMDBBRUVGIiwiIzAwQTY1MSIsIiNFRDFDMjQiKSkrCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpgYGAKCgpgYGAge3J9Cgptb2RfbGlzdDIgPC0gbGlzdChtb2RfUzMwLCBtb2RfRTMwLCBtb2RfRVMyMCwgbW9kX1MyMCwgbW9kX0UyMCkgI3JlYXJyYW5nZWQgdGhlIG9yZGVyIHNvIHRoYXQgaXQgbWF0Y2hlcyBpbnRleHQgcmVzdWx0cwoKbW9kX3JlczIgPC0gbGFwcGx5KG1vZF9saXN0MiwgZnVuY3Rpb24oeCkgbW9kX3Jlc3VsdHMoeCwgbW9kID0gIkludCIpKQoKbWVyZ2VkMiA8LSBzdWJtZXJnZShtb2RfcmVzMltbMV1dLCBtb2RfcmVzMltbMl1dLCAgbW9kX3JlczJbWzNdXSwgbW9kX3JlczJbWzRdXSwgIG1vZF9yZXMyW1s1XV0sIG1peCA9IFQpCgptZXJnZWQyJG1vZF90YWJsZSRuYW1lIDwtIGZhY3RvcihtZXJnZWQyJG1vZF90YWJsZSRuYW1lLCBsZXZlbHMgPSBjKCJJbnRyY3B0MSIsIAogICAgIkludHJjcHQyIiwgIkludHJjcHQzIiwgIkludHJjcHQ0IiwgIkludHJjcHQ1IiksIAogICAgbGFiZWxzID0gcmV2KGMoIkVDL0NDIiwgIkNTL0NDIiwgIkVTL0NDIiwgIkVTL0NTIiwgIkVTL0VDIikpKQoKbWVyZ2VkMiRkYXRhJG1vZGVyYXRvciA8LSBmYWN0b3IobWVyZ2VkMiRkYXRhJG1vZGVyYXRvciwgbGV2ZWxzID0gYygiSW50cmNwdDEiLCAKICAgICJJbnRyY3B0MiIsICJJbnRyY3B0MyIsICJJbnRyY3B0NCIsICJJbnRyY3B0NSIpLCAKICAgIGxhYmVscyA9IHJldihjKCJFQy9DQyIsICJDUy9DQyIsICJFUy9DQyIsICJFUy9DUyIsICJFUy9FQyIpKSkKCm9yY2hhcmQyIDwtIG9yY2hhcmRfcGxvdChtZXJnZWQyLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIiwgYW5nbGUgPSAwKSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMgCiAgeGxpbSgtMiw0LjUpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNCwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjN0I4MUJFIiwiI0Q3REYyMyIsIiNGMzcxNTgiLCIjNzVDQkYyIiwiIzk3RDJCNCIpKSsgIyBjaGFuZ2UgY29sb3VycwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjN0I4MUJFIiwiI0Q3REYyMyIsIiNGMzcxNTgiLCIjNzVDQkYyIiwiIzk3RDJCNCIpKSsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCmBgYAoKYGBgIHtyfQoKcDEgPC0gb3JjaGFyZDEgKyBvcmNoYXJkMiArICBwbG90X2Fubm90YXRpb24odGFnX2xldmVscyA9ICdBJykKcDEKCiNzYXZlZCBhcyBQREY6IDYgeCAxNSBpbmNoZXMKYGBgCioqRmlnLiAzKiogT3JjaGFyZCBwbG90cyBzaG93aW5nIHRoZSBlaWdodCBtZXRhLWFuYWx5dGljIG1vZGVscy4gKEEpIG1haW4gZWZmZWN0cyBvZiBlbnJpY2htZW50IGFuZCBzdHJlc3MsIGFuZCBpbnRlcmFjdGlvbiBvZiBlbnZpcm9ubWVudGFsIGVucmljaG1lbnQgYW5kIHN0cmVzcywgKEIpIOKAmHBhaXJ3aXNl4oCZIGNvbXBhcmlzb25zIGJldHdlZW4gdHJlYXRtZW50cyBhbmQgY29udHJvbHMuIFRoaWNrIGJsYWNrIGxpbmVzID0gOTUlIENJLCB0aGluIGJsYWNrIGxpbmVzID0gOTUgJSBQSS4gCgojIyMgUGFuZWwgb2YgbWV0YS1yZWdyZXNzaW9ucyB7LnRhYnNldH0KCiMjIyMgRW52aXJvbm1lbnRhbCBlbnJpY2htZW50ClVzZWQgdG8gcHJvZHVjZSBGaWcuIDQKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KI0VucmljaG1lbnQKRV9tb2QgPC0gKEx2c01fRSArIExlYXJuaW5nX0UgKyBSZWluZm9yY2VtZW50X0UpLyAoQWdlX0UgKyBFeGVyY2lzZV9FICsgU29jaWFsX0UpICsgIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gJ0EnKQoKRV9tb2QKI3NhdmVkIGFzIHBkZiAxMCB4IDE1IGluY2hlcwpgYGAKKipGaWcuIDQqKiBPcmNoYXJkIHBsb3RzIHNob3dpbmcgdGhlIHNpeCBkaWZmZXJlbnQgbWV0YS1yZWdyZXNzaW9ucyBvbiB0aGUgbWFpbiBlZmZlY3Qgb2YgZW52aXJvbm1lbnRhbCBlbnJpY2htZW50IG9uIGxlYXJuaW5nIGFuZCBtZW1vcnkuIChBKSAgbGVhcm5pbmcgdmVyc3VzIG1lbW9yeSByZXNwb25zZSwgKEIpIHRoZSB0eXBlIG9mIGFzc2F5LCAoQykgdGhlIHR5cGUgb2YgcmVpbmZvcmNlbWVudCwgKEQpIHRoZSBhZ2UgYXQgZW52aXJvbm1lbnRhbCBlbnJpY2htZW50LCAoRSkgdHlwZSBvZiBtYW5pcHVsYXRpb24gb2YgZXhlcmNpc2UgZHVyaW5nIGVucmljaG1lbnQsIChGKSBtYW5pcHVsYXRpb24gb2YgdGhlIHNvY2lhbCBlbnZpcm9ubWVudCBkdXJpbmcgZW5yaWNobWVudC4gIAoKIyMjIyBTdHJlc3MKVXNlZCB0byBwcm9kdWNlIEZpZy4gNQpgYGAge3IsICBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KU19tb2QgPC0gKEx2c01fUyArIExlYXJuaW5nX1MgKyBSZWluZm9yY2VtZW50X1MpIC8gKEFnZV9TICsgU3RyZXNzb3IgKyBEdXJhdGlvbl9TKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gJ0EnKQoKU19tb2QKI3NhdmVkIGFzIHBkZiAxMCB4IDE1IGluY2hlcwpgYGAKKipGaWcuIDUqKiBPcmNoYXJkIHBsb3RzIHNob3dpbmcgdGhlIHNpeCBkaWZmZXJlbnQgbWV0YS1yZWdyZXNzaW9ucyBvbiB0aGUgbWFpbiBlZmZlY3Qgb2Ygc3RyZXNzIG9uIGxlYXJuaW5nIGFuZCBtZW1vcnkuIChBKSBsZWFybmluZyB2ZXJzdXMgbWVtb3J5IHJlc3BvbnNlLCAoQikgdGhlIHR5cGUgb2YgYXNzYXksIChDKSB0aGUgdHlwZSBvZiByZWluZm9yY2VtZW50LCAoRCkgdGhlIGFnZSBhdCBzdHJlc3MsIChFKSB0aGUgdHlwZSBvZiBzdHJlc3NvciAoTVMgPSBtYXRlcm5hbCBzZXBhcmF0aW9uKSwgKEYpIGNocm9uaWMgb3IgYWN1dGUgc3RyZXNzLiAKCiMjIyMgSW50ZXJhY3Rpb24KVXNlZCB0byBwcm9kdWNlIEZpZy4gNgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpFU19tb2QgPC0gcGxvdF9ncmlkKEx2c01fRVMsIExlYXJuaW5nX0VTLCBSZWluZm9yY2VtZW50X0VTLCBBZ2VfZW5yaWNobWVudF9FUywgQWdlX3N0cmVzc19FUywgT3JkZXJfRVMsIEV4ZXJjaXNlX0VTLCBTb2NpYWxfRVMsIFN0cmVzc29yX0VTLCBEdXJhdGlvbl9FUywKICBsYWJlbHMgPSAiQVVUTyIsIG5jb2wgPSA1KQoKRVNfbW9kCiNzYXZlZCBhcyAxMCB4IDIwIGluY2hlcwpgYGAKKipGaWcuIDYqKiBPcmNoYXJkIHBsb3RzIHNob3dpbmcgdGhlIDEwIGRpZmZlcmVudCBtZXRhLXJlZ3Jlc3Npb25zIG9mIG1vZGVyYXRvcnMgb24gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gZW52aXJvbm1lbnRhbCBlbnJpY2htZW50IGFuZCBzdHJlc3MgbGVhcm5pbmcgYW5kIG1lbW9yeS4gKEEpIGxlYXJuaW5nIHZlcnN1cyBtZW1vcnkgcmVzcG9uc2UsIChCKSB0aGUgdHlwZSBvZiBhc3NheSwgKEMpIHRoZSB0eXBlIG9mIHJlaW5mb3JjZW1lbnQgdXNlZCwgKEQpIHRoZSBhZ2UgYXQgZW52aXJvbm1lbnRhbCBlbnJpY2htZW50LCAoRSkgdGhlIGFnZSBhdCBzdHJlc3MsIChGKSB0aGUgb3JkZXIgb2YgdHJlYXRtZW50IGV4cG9zdXJlLCAoRykgaWYgZW5yaWNobWVudCBpbnZvbHZlZCBhIG1hbmlwdWxhdGlvbiBvZiBleGVyY2lzZSwgKEgpIG1hbmlwdWxhdGlvbiBvZiB0aGUgc29jaWFsIGVudmlyb25tZW50IGR1cmluZyBlbnJpY2htZW50LCAoSSkgdGhlIHR5cGUgb2Ygc3RyZXNzb3IsIChGKSBzdHJlc3Mgd2FzIGNocm9uaWMgb3IgYWN1dGUuIAoKIyMjIFBhbmVsIG9mIGZ1bm5lbCBwbG90cwpVc2VkIHRvIHByb2R1Y2UgRmlnLiA3CmBgYCB7ciwgZXZhbCA9IEZBTFNFfQojIEVFCgpwZGYoTlVMTCkKZGV2LmNvbnRyb2woZGlzcGxheWxpc3Q9ImVuYWJsZSIpCnBhcihtYXI9Yyg0LDQsMC4xLDApKQpBIDwtIGZ1bm5lbChtb2RfU2ZtLCB4bGFiID0gIlJlc2lkdWFscyAobG5SUikiLCB5bGFiID0gIlN0YW5kYXJkIEVycm9yIiwKICAgICAgICB4bGltID0gYygtMiwyKSwKICAgICAgICB5bGltID0gYygwLDEuMDUpKQpBIDwtIHJlY29yZFBsb3QoKQppbnZpc2libGUoZGV2Lm9mZigpKQoKIyBTdHJlc3MKCnBkZihOVUxMKQpkZXYuY29udHJvbChkaXNwbGF5bGlzdD0iZW5hYmxlIikKcGFyKG1hcj1jKDQsNCwwLjEsMCkpCkIgPC0gZnVubmVsKG1vZF9TZm0sIHhsYWIgPSAiUmVzaWR1YWxzIChsblJSKSIsIHlsYWIgPSAiU3RhbmRhcmQgRXJyb3IiLAogICAgICAgIHhsaW0gPSBjKC0yLDIpLAogICAgICAgIHlsaW0gPSBjKDAsMS4wNSkpCkIgPC0gcmVjb3JkUGxvdCgpCmludmlzaWJsZShkZXYub2ZmKCkpCgojIEludGVyYWN0aW9uCnBkZihOVUxMKQpkZXYuY29udHJvbChkaXNwbGF5bGlzdD0iZW5hYmxlIikKcGFyKG1hcj1jKDQsNCwwLjEsMCkpCkMgPC0gZnVubmVsKG1vZF9FU2ZtLCB4bGFiID0gIlJlc2lkdWFscyAobG5SUikiLCB5bGFiID0gIlN0YW5kYXJkIEVycm9yIiwKICAgICAgICB4bGltID0gYygtMiwyKSwKICAgICAgICB5bGltID0gYygwLDEuMDUpKQpDIDwtIHJlY29yZFBsb3QoKQppbnZpc2libGUoZGV2Lm9mZigpKQoKIyBwdXR0aW5nIHRvZ2V0aGVyCmdnZHJhdyhBKSArIGdnZHJhdyhCKSArIGdnZHJhdyhDKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gJ0EnKQoKI3BuZyhmaWxlID0gaGVyZSgiZmlncyIsICJGaWc3X0Z1bm5lbHMucG5nIikpCiAKI2Rldi5vZmYoKQpgYGAKCmBgYHtyLCBvdXQuaGVpZ2h0PSIxMjAlIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZSgiZmlncyIsICJmdW5uZWxzLnBuZyIpKQpgYGAKCioqRmlnLiA3KiogRnVubmVsIHBsb3RzIG9mIHRoZSBzdGFuZGFyZCBlcnJvciBhbmQgcmVzaWR1YWxzIChsblJSKSBmcm9tIHRoZSBmdWxsIG1vZGVscy4gKEEpIGVudmlyb25tZW50YWwgZW5yaWNobWVudCBtYWluIGVmZmVjdCwgKEIpIHN0cmVzcyBtYWluIGVmZmVjdCwgKEMpIGVudmlyb25tZW50YWwgZW5yaWNobWVudCB4IHN0cmVzcyBpbnRlcmFjdGlvbi4KCiMgU29mdHdhcmUgYW5kIHBhY2thZ2UgdmVyc2lvbnMKCmBgYHtyfQpzZXNzaW9uSW5mbygpICU+JSBwYW5kZXIoKQpgYGAKCg==